题目:与33题类似,也是在被翻转的有序数组中查找元素。不同的是数组中可能有重复的元素出现。
分析:数组中的元素可以重复导致的问题就是如果first小于等于mid,那么前半部分也不一定是有序的,例如[1 3 1 1 1 1 1 ]。因此我们把判断条件进一步细分,分为三种情况,大于,小于和等于。等于的时候直接first++就可以了。
代码:
class Solution {
public:
bool search(int A[], int n, int target) {
int first=0;
int last=n;
while(first!=last){
const int mid=first+(last-first)/2;
if(A[mid]==target)
return true;
if(A[first]<A[mid]){
if(A[first]<=target&&target<A[mid])
last=mid;
else
first=mid+1;
}
else if(A[first]>A[mid]){
if(A[mid]<target&&target<=A[last-1])
first=mid+1;
else
last=mid;
}
else first++;
}
return false;
}
};该算法的时间复杂度为O(log n),空间复杂度为O(1)。
leetcode|81|Search in Rotated Sorted Array II
原文地址:http://blog.csdn.net/dainiwan/article/details/43483189