1. 程式人生 > >Find Minimum in Rotated Sorted Array II -- LeetCode

Find Minimum in Rotated Sorted Array II -- LeetCode

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,我們並不知道應該截掉哪一半。

解決的辦法僅僅能是對邊緣移動一步。直到邊緣和中間不在相等或者相遇,這就導致了會有不能切去一半的可能。所以最壞情況就會出現每次移動一步。總共移動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;
}
在面試中這種問題還是比較常見的,如今的趨勢是面試官傾向於從一個問題出發。然後follow up問一些擴展的問題,並且這個題目涉及到了復雜度的改變,所以面試中確實是一個好題。自然也更有可能出現哈。

Find Minimum in Rotated Sorted Array II -- LeetCode