# 153 Find Minimum in Rotated Sorted Array

一個向右rotate若干element的sorted array,找出最小值。

Concept:

這題可以從頭跑到尾解掉,但題目的目的是要我們用binary search。

列出幾個可能性觀察一下

1234 567 7123 456 6712 345 4567 123

發現每次切半後,如果nums[start] > nums[mid]或nums[mid] > nums[end],最小值就在那一半邊,

如果切半後兩邊都是照順序排好的,那就比較nums[start]和nums[mid],比較小的就是最小值了。

Note: 這題讓我卡了比較久的部分是區間要取mid+1還是-1。最後結論:因為(start+end)/2是會自動捨去,所以要取的區間是[start,mid]和[mid+1,end]。

Pseudocode:

mid = (start+end)/2
while starts<=end
    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

Code:

public class Solution {
    public int findMin(int[] nums) {

        int start = 0, end = nums.length-1;
        int mid, min=0;
        if(nums.length == 1)
            return nums[0];
        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 ""