LeetCode-Search in Rotated Sorted Array II-在旋转数组中搜索-二分查找

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;
    }
};

 

posted @ 2014-10-20 18:52  zombies  阅读(162)  评论(0编辑  收藏  举报