Search in Rotated Sorted Array II

来源:互联网 发布:linux语言改为中文 编辑:程序博客网 时间:2024/04/29 17:47
class Solution {public:    bool bsearch(int start,int end,int target,int A[])    {            while(start<end)            {                int mid=start+(end-start)/2;                if(A[mid]==target)                {                    return true;                }                if(A[mid]>target)                {                    end=mid;                }                else                {                    start=mid+1;                }            }            return false;    }    bool search(int A[], int n, int target) {        if(n==0)        {            return false;        }        if(n==1)        {            if(A[0]==target)            {                return true;            }            else            {                return false;            }        }        if(A[0]==A[n-1])        {            for(int i=0;i<n;++i)            {                if(A[i]==target)                {                    return true;                }            }            return false;        }        else if(A[0]>A[n-1])        {            int pstart=0;            int pend=n-1;            while(pstart<pend)            {                int mid=pstart+(pend-pstart)/2;                if(A[mid]<A[0])                {                    pend=mid;                }                else                {                    pstart=mid+1;                }            }            if(target==A[0])            {                return true;            }            else if(target>A[0])            {                return bsearch(0,pstart,target,A);            }            else            {                return bsearch(pstart,n,target,A);            }        }        else        {            return bsearch(0,n,target,A);        }    }};


基本思路是利用二分查找,不同于之前的题目Search in Rotated Sorted Array,这里数组元素可能会有重复。所以要分情况讨论,当A[0]<A[n-1],没有旋转,直接二分查找;

当A[0]>A[n-1],有旋转,找到第二段的起点,然后在前半段或者后半段进行二分查找;当A[0]==A[n-1,无法通过二分查找找到第二段的起点,所以只能退化为线性搜索。

0 0