Leetcode - Find Minimum in Rotated Sorted Array

Leetcode - Find Minimum in Rotated Sorted Array_第1张图片
Paste_Image.png

My code:

public class Solution {
    public int findMin(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        int minIndex = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] >= nums[i - 1])
                continue;
            else {
                minIndex = i;
                break;
            }
        }
        return nums[minIndex];
    }
}

My test result:

Leetcode - Find Minimum in Rotated Sorted Array_第2张图片

这不是一个好方法。
下面介绍 binary search 版方法。

My code:

public class Solution {
    public int findMin(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        int minIndex = findMin(0, nums.length - 1, nums);
        
        return nums[minIndex];
    }
    
    private int findMin(int begin, int end, int[] nums) {
        if (begin == end)
            return begin;
        int mid = (begin + end) / 2;
        if (nums[mid] < nums[end]) // right part is sorted so minimun exists in the left
            return findMin(begin, mid, nums);
        else // left part is sorted so minimun exists in the right
            return findMin(mid + 1, end, nums);
        
    }
}

My test result:

Leetcode - Find Minimum in Rotated Sorted Array_第3张图片
Paste_Image.png

一下子快了好多。
上一种算法复杂度是O(n), 而这个复杂度是 O(log n)
上一个算法就是从头遍历,找到突然开始变小的位置,就是最小值。
仔细介绍该算法。

Leetcode - Find Minimum in Rotated Sorted Array_第4张图片

如上图所示:

当 nums[mid] > nums[end] 时,表示,左侧已经排好序了,右侧没有,最小值一定出现在右侧。
当 nums[mid] < nums[end] 时,表示,右侧已经排好序了,左侧没有,最小值一定出现在左侧。

然后利用这个规则,还用 binary search 的思想,不断递归,直到找到最小值。
算法复杂度是 O(log n)

**
总结: Array, Binary Search
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int findMin(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        int begin = 0;
        int end = nums.length - 1;
        while (begin < end) {
            int middle = (begin + end) / 2;
            if (nums[middle] < nums[end]) {
                end = middle;
            }
            else { // nums[middle] >= nums[end] which means nums[middle] is not the absolute minimum elem
                begin = middle + 1;
            }
        }
        return nums[begin];
    }
}

没什么难的。主要在一个地方思考了下。
当 nums[middle] < nums[end]时,end = middle.
But, 当nums[middle] >= nums[end]时, begin = middle + 1, 因为nums[middle]一定不是唯一的那个最小值。所以可以排除他,进一步缩小范围。

Anyway, Good luck, Richardo!

你可能感兴趣的:(Leetcode - Find Minimum in Rotated Sorted Array)