您的位置:首页 > 其它

Leetcode@Search in Rotated Sorted Array

2015-01-04 18:39 295 查看


题目:

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 
0 1 2 4 5 6 7
 might become 
4
5 6 7 0 1 2
).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

解题思路:

(1)直接搜索 时间复杂度O(n) 其实这是最容易想到的解法



class Solution {
public:
int search(int A[], int n, int target) {
if(A == NULL || n <= 0)
return -1;
for(int i = 0; i < n; ++i)
if(A[i] == target)
return i;
return -1;
}
};


(2)二分搜索 属于从有序数组中查找某个值的变形 时间复杂度O(logn)

 如果在l到r的区间内搜索,有如下两种情况:

1.A[l] < A[r] 那么表明区间是有序排列的,按照正常的二分搜索处理

2.A[l] > A[r] 这表明区间存在翻转,那么存在一个k,使得A[k]是区间内的最小值,这样,A[l]到A[k] 与A[k+1]到A[r]为两个有序数组

所以只需要对A[mid]与A[r]作比较:

1.如果A[mid] > A[r] 表明一定存在翻转,接下来只需要判断target的位置,如果target位于A[l]和A[mid]之间 ,r = mid - 1,否则l = mid + 1
2.r如果A[mid] < A[r]  ,那么说明从m到r一定是有序的(没有受到rotate的影响),那么我们只需要判断target是不是在mid到r之间。如果target位于A[mid]和A[r]之间,正常二分搜索,把左边缘移到mid+1,l
= mid + 1,否则,target在另一半,把右边缘移动到mid-1,r = mid - 1

class Solution {
public:
int search(int A[], int n, int target) {
if(NULL == A || 0 == n)
return -1;
int left = 0, right = n-1, mid = 0;
while(left <= right)
{
mid = left+(right-left)/2;
if(A[mid] == target)
return mid;
else if(A[mid] > A[right])//left
{
if(A[left] <= target && target < A[mid])
right = mid - 1;
else
left = mid + 1;

}
else//right
{
if(A[mid] < target && target <= A[right])
left = mid + 1;
else
right = mid - 1;
}
}

return -1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: