Find Minimum in Rotated Sorted Array II -- LeetCode
阿新 • • 發佈:2017-08-16
mod -- find ray article 我們 math 中心 算法
這道題是Search in Rotated Sorted Array的擴展,思路在Find Minimum in Rotated Sorted Array中已經介紹過了。和Find Minimum in Rotated Sorted Array唯一的差別是這道題目中元素會有反復的情況出現。只是正是由於這個條件的出現,影響到了算法的時間復雜度。原來我們是依靠中間和邊緣元素的大小關系。來推斷哪一半是不受rotate影響。仍然有序的。而如今由於反復的出現,如果我們遇到中間和邊緣相等的情況。我們就無法推斷哪邊有序,由於哪邊都有可能有序。如果原數組是{1,2,3,3,3,3,3},那麽旋轉之後有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},這種我們推斷左邊緣和中心的時候都是3,我們並不知道應該截掉哪一半。 在面試中這種問題還是比較常見的,如今的趨勢是面試官傾向於從一個問題出發。然後follow up問一些擴展的問題,並且這個題目涉及到了復雜度的改變,所以面試中確實是一個好題。自然也更有可能出現哈。
解決的辦法僅僅能是對邊緣移動一步。直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況就會出現每次移動一步。總共移動n此。算法的時間復雜度變成O(n)。
代碼例如以下:
public int findMin(int[] num) { if(num == null || num.length==0) return 0; int l = 0; int r = num.length-1; int min = num[0]; while(l<r-1) { int m = (l+r)/2; if(num[l]<num[m]) { min = Math.min(num[l],min); l = m+1; } else if(num[l]>num[m]) { min = Math.min(num[m],min); r = m-1; } else { l++; } } min = Math.min(num[r],min); min = Math.min(num[l],min); return min; }
Find Minimum in Rotated Sorted Array II -- LeetCode