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

Find Minimum in Rotated Sorted Array -- LeetCode

arc ria ref ava 變量 data- nim == tracking

這道題是Search in Rotated Sorted Array的擴展,差別就是如今不是找一個目標值了,而是在bst中找最小的元素。主要思路還是跟Search in Rotated Sorted Array差點兒相同。還是通過左邊界和中間的大小關系來得到左邊或者右邊有序的信息。假設左半邊有序。那麽左半邊最小就是左邊第一個元素,能夠和當前最小相比取小的,然後走向右半邊。否則,那麽就是右半半邊第一個元素,然後走向左半邊。這樣子每次能夠截掉一半元素,所以最後復雜度等價於一個二分查找。是O(logn),空間上僅僅有四個變量維護二分和結果,所以是O(1)。代碼例如以下:
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這道題這考慮了元素反復的情況,這裏僅僅是為了算法更加一般性。就把那個情況也包括進來,有興趣的朋友能夠看看Find Minimum in Rotated Sorted Array II對反復元素的分析哈。

Find Minimum in Rotated Sorted Array -- LeetCode