LeetCode Find Minimum in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

思路分析:這題主要考察二分查找,在Rotated Sorted Array中找最小和Search in Rotated Sorted Array類似,只不過此時需要不斷把最左邊的元素A[l]與A[m]比較

1. 如果A[m] < A[l] 那麼應該在左邊找,更新右邊的邊界right;

2.如果A[m] > A[l] 那麼應該在右邊找,更新左邊的邊界left;

3.如果A[m]= A[l] ,l++;

上述規律可以通過舉例子很快發現,這樣可以每次減少一半元素,得到O(logN)的算法。注意這題A[m] = A[l] 也有可能發生,雖然沒有重複元素,但是m和l可能指向同一個元素,比如當這個數組只有兩個元素的時候。如果A[m]= A[l] ,可以執行l++;丟掉一個“冗餘元素”也不會丟掉最小值。對於Rotated Sorted Array中有冗餘值的情況可以參考本題的擴展Find Minimum in Rotated Sorted Array II

AC Code

public class Solution {
    public int findMin(int[] nums) {
        int n = nums.length;
        int l = 0;
        int r = n-1;
        int min = nums[0];
        while(l < r){
    	    int m = l + (r-l) / 2;
        	if(nums[m] < nums[l]) {
        		min = Math.min(nums[m], min);
        	    r = m;
            } else if(nums[m] > nums[l]){
            	min = Math.min(nums[l], min);
            	l = m;
            } else {
            	l++;
            }
        }
        min = Math.min(nums[l], min);
        min = Math.min(nums[r], min);
        return min;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章