標籤:leetcode java search in rotated so
題目:
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.
題意:
伴隨著問題《Search in Rotated Sorted Array》:
如果重複元素是被允許的呢?
寫出一個函數判定目標值是否在數組中。
演算法分析:
這種問題我開始就是直接從頭到尾遍曆一遍,這樣不就把目標元素找出來了麼,開始我認為這個不就這麼簡單麼。
可是這樣的時間複雜度為O(n),雖然同樣能AC,但是不是我們追求的演算法哈。
參考http://blog.csdn.net/linhuanmars/article/details/20588511
這道題是二分尋找Search Insert Position的變體,思路在Search in Rotated Sorted Array中介紹過了,不瞭解的朋友可以先看看那道題哈。和Search in Rotated Sorted Array唯一的區別是這道題目中元素會有重複的情況出現。不過正是因為這個條件的出現,出現了比較複雜的case,甚至影響到了演算法的時間複雜度。原來我們是依靠中間和邊緣元素的大小關係,來判斷哪一半是不受rotate影響,仍然有序的。而現在因為重複的出現,如果我們遇到中間和邊緣相等的情況,我們就丟失了哪邊有序的資訊,因為哪邊都有可能是有序的結果。假設原數組是{1,2,3,3,3,3,3},那麼旋轉之後有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},這樣的我們判斷左邊緣和中心的時候都是3,如果我們要尋找1或者2,我們並不知道應該跳向哪一半。解決的辦法只能是對邊緣移動一步,直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況(比如全部都是一個元素,或者只有一個元素不同於其他元素,而他就在最後一個)就會出現每次移動一步,總共是n步,演算法的時間複雜度變成O(n)。
AC代碼:
<span style="font-family:Microsoft YaHei;font-size:12px;">public boolean search(int[] A, int target) { if(A==null || A.length==0) return false; int l = 0; int r = A.length-1; while(l<=r) { int m = (l+r)/2; if(A[m]==target) return true; if(A[m]>A[l]) { if(A[m]>target && A[l]<=target) { r = m-1; } else { l = m+1; } } else if(A[m]<A[l]) { if(A[m]<target && A[r]>=target) { l = m+1; } else { r = m-1; } } else { l++; } } return false;}</span>
著作權聲明:本文為博主原創文章,轉載註明出處
[LeetCode][Java] Search in Rotated Sorted Array II