LeetCode 81 - 搜索旋轉排序數組 II - [二分+暴力]

假設按照升序排序的數組在預先未知的某個點上進行了旋轉。數組

( 例如,數組 [0,0,1,2,2,5,6] 可能變爲 [2,5,6,0,0,1,2] )。函數

編寫一個函數來判斷給定的目標值是否存在於數組中。若存在返回 true,不然返回 false。spa

示例 1:code

輸入: nums = [2,5,6,0,0,1,2], target = 0
輸出: trueblog

示例 2:排序

輸入: nums = [2,5,6,0,0,1,2], target = 3
輸出: falseget

進階:io

這是 搜索旋轉排序數組 的延伸題目,本題中的 nums 可能包含重複元素。
這會影響到程序的時間複雜度嗎?會有怎樣的影響,爲何?class

 

這題關鍵問題就是在可能有重複的數字出現,當咱們在二分查找分界點時,只有嚴格大於和小於才能肯定分界點在哪一側,不然就只能在 $[l,r]$ 之間暴力找了。進階

 

AC代碼:

bool Srch(const vector<int>& a,int st,int ed,int x)
{
    int l=st, r=ed;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(a[mid]<x) l=mid+1;
        else r=mid;
    }
    if(a[l]!=x) return 0;
    else return 1;
}

class Solution
{
public:
    bool search(const vector<int>& a,int x)
    {
        if(a.empty()) return 0;
        if(a.front()<a.back())
            return Srch(a,0,a.size()-1,x);

        int l=0, r=a.size()-1;
        while(r-l>1)
        {
            int mid=(l+r)/2;
            if(a[mid]>a.front()) l=mid;
            else if(a[mid]<a.back()) r=mid;
            else
            {
                int tp;
                for(int i=l;i<r;i++)
                {
                    if(a[i]>a[i+1])
                    {
                        tp=i;
                        break;
                    }
                }
                l=tp, r=tp+1;
                break;
            }
        }

        return max(Srch(a,0,l,x),Srch(a,r,a.size()-1,x));
    }
};
相關文章
相關標籤/搜索