假設按照升序排序的數組在預先未知的某個點上進行了旋轉。數組
( 例如,數組 [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)); } };