https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
当允许相等时,就要考虑各种边界条件。我的策略是把每个>,<,=都分类讨论,这样比较复杂,但是逻辑比较清晰。
另当A[l]=A[r]时,需要线性搜索一个不等于A[l]的位置收缩l指针。
class Solution { public: bool search(int A[], int n, int target) { int l=0; int r=n-1; int x=target; while(r>l){ int mid=(l+r)/2; if (x==A[mid]) return true; if (A[l]<A[r]) { if (x<A[mid]) r=mid; else l=mid+1; } else if(A[l]>A[r]){ //Al>Ar if (A[mid]<A[r]) { if (x<A[mid]) r=mid; else {//x > mid if (x>A[r]) r=mid; else l=mid+1; } } else if(A[mid]>A[r]){ if (x>A[mid]) l=mid+1; else { if (x>A[r]) r=mid; else l=mid+1; } } else { //A[mid]==A[r] if (A[mid]>A[l]) { if (x<A[mid]){ if(x>A[r]) r=mid; else l=mid+1; } else l=mid+1; } else r=mid; } } else { //A[l]==A[r] bool eq=true; for(int i=l;i<=r;i++) { if(A[i]!=A[l]) { eq=false; l=i; break; } } if(eq) return false; } } if (A[l]==x) return true; return false; } };