#153 & #154 Find Minimum in Rotated Sorted Array I, II

在一個排序過又旋轉過的陣列中找到minimum,II是允許數字重複

Concept
input陣列是排序過的,所以可以用binary search。
舉個例子來看一下

4 5 6 1 2 3

一開始start = 0, end = 5, 取出(0 + 5)/2的值 -- 6

6比start大(表示前半是按照大小排序),也比end大(違反排序,此處有旋轉),

當mid比end大時,表示最小值在mid和end之間,

就在[mid,end]範圍中找。

6 1 2 3 4 5

start比mid大,違反排序,在此範圍中繼續找。

1 2 3 4 5 6

前半和後半都符合排序,比較前半的第一個和後半的第一個,找出min。

II多了可以有duplicate的條件,

會有這種例子

10 1 10 10 10 10

此時mid和start和end都一樣,就不能用原本的方法了。

只要把後面的10都排除掉

10 1

就可以用I的方法做了。

Code

public class Solution {
    public int findMin(int[] nums) {
        /*
        mid = (start+end)/2
        if nums[starts] > nums[mid]
            min is in this range
        if nums[mid] > nums[end]
            min is in this range
        compare starts and mid, smaller one is the smallest
        */
        int start = 0, end = nums.length-1;
        int mid, min=0;
        if(nums.length == 1)
            return nums[0];
        /*handle duplicate*/            
        while (nums[end] == nums[start] && end > start) {
            end--;
        }

        while(start<=end){
            mid = (start + end)/2;
            if(nums[start] > nums[mid]){
                end = mid;
            }
            else if(nums[mid+1] > nums[end]){
                start = mid+1;
            }
            else{
                min = nums[start] < nums[mid+1] ? nums[start]: nums[mid+1];
                break;
            }
        }
        return min;
    }
}

results matching ""

    No results matching ""