题目:与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