LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索
Follow up for "Search in Rotated Sorted Array":
What if?duplicates?are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
1 class Solution { 2 public: 3 bool search(int A[], int n, int target) { 4 int l=0,r=n-1; 5 while(l<=r){ 6 if(target==A[l]||target==A[r]) 7 return true; 8 int m =(l+r)/2; 9 if(target==A[m]) 10 return true; 11 if(A[l]<A[m]){ 12 if(target<A[m]&&target>A[l]) 13 r=m-1; 14 else 15 l=m+1; 16 }else if(A[l]>A[m]){ 17 if(target>A[m]&&target<A[r]) 18 l=m+1; 19 else 20 r=m-1; 21 }else 22 l++; 23 } 24 return false; 25 } 26 };?
這道題是二分查找Search Insert Position的變體,思路在Search in Rotated Sorted Array中介紹過了,不了解的朋友可以先看看那道題哈。和Search in Rotated Sorted Array唯一的區(qū)別是這道題目中元素會有重復的情況出現(xiàn)。不過正是因為這個條件的出現(xiàn),出現(xiàn)了比較復雜的case,甚至影響到了算法的時間復雜度。原來我們是依靠中間和邊緣元素的大小關(guān)系,來判斷哪一半是不受rotate影響,仍然有序的。而現(xiàn)在因為重復的出現(xiàn),如果我們遇到中間和邊緣相等的情況,我們就丟失了哪邊有序的信息,因為哪邊都有可能是有序的結(jié)果。假設(shè)原數(shù)組是{1,2,3,3,3,3,3},那么旋轉(zhuǎn)之后有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},這樣的我們判斷左邊緣和中心的時候都是3,如果我們要尋找1或者2,我們并不知道應(yīng)該跳向哪一半。解決的辦法只能是對邊緣移動一步,直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況(比如全部都是一個元素,或者只有一個元素不同于其他元素,而他就在最后一個)就會出現(xiàn)每次移動一步,總共是n步,算法的時間復雜度變成O(n)。代碼如下:
轉(zhuǎn)載于:https://www.cnblogs.com/zl1991/p/7079377.html
總結(jié)
以上是生活随笔為你收集整理的LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 加入粘贴板的功能(复制功能)
- 下一篇: jmeter察看结果树-响应数据乱码