当前位置 : 首页 » 文章分类 :  算法  »  LeetCode.153.Find Minimum in Rotated Sorted Array 旋转排序数组中的最小值

LeetCode.153.Find Minimum in Rotated Sorted Array 旋转排序数组中的最小值

题目描述

153 Find Minimum in Rotated Sorted Array
https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/

Suppose an array sorted in ascending order 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.

Example 1:

Input: [3,4,5,1,2]
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

相似题目

LeetCode.033.Search in Rotated Sorted Array 搜索旋转排序数组
LeetCode.153.Find Minimum in Rotated Sorted Array 旋转排序数组中的最小值


解题过程

找旋转有序数组的最小值,二分搜索。用mid和low,high比较,判断转折点也就是极值点的位置:
当 a[low,…,high] 是旋转升序数组时(完全有序不考虑),并且也没有重复值时:
如果 a[mid]>a[low],说明左边升序,转折点在右边,最小值也在右边,也可以用 a[mid]>a[high] 判断
如果 a[mid]<a[low],说明右边升序,转折点在左边,最小值也在左边,也可以用 a[mid]<a[high] 判断

思想很好理解,但里面有坑,很容易出错。当a是{2,1}这种只有2个值且倒序的数组,这时a[low]==a[mid],很容易出错,我改了好几遍才写对。

SolutionV2018

private static class SolutionV2018 {
    public int findMin(int[] nums) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            //先判断nums[low,...,high]是否升序,即无旋转
            if (nums[low] <= nums[high]) {
                return nums[low];
            }
            //nums[low,...,high]不是升序
            int mid = (low + high) / 2;
            if (nums[mid] >= nums[low]) {//左边升序,转折点在右边,最小值也在右边
                low = mid + 1;
            } else {//右边升序,转折点在左边,最小值也在左边
                high = mid;
            }
        }
        return nums[low];
    }
}

SolutionV2020

第二遍写,竟然写的更复杂了

private static class SolutionV2020 {
    public int findMin(int[] nums) {
        int low = 0, high = nums.length - 1;
        while (low <= high) {
            if (low == high) {
                return nums[low];
            }
            if (high == low + 1) {
                return Math.min(nums[low], nums[high]);
            }
            int mid = (low + high) / 2;
            if (nums[mid] < nums[mid - 1]) {
                return nums[mid];
            }
            if (nums[low] <= nums[mid] && nums[mid] <= nums[high]) {
                // 左右都有序
                return nums[low];
            } else if (nums[low] <= nums[mid]) {
                // 左边是有序的,最小值肯定再右边
                low = mid + 1;
            } else {
                // 右边是有序的,最小值肯定在左边
                high = mid - 1;
            }
        }
        return nums[low];
    }
}

GitHub代码

algorithms/leetcode/leetcode/_153_FindMinimumInRotatedSortedArray.java
https://github.com/masikkk/algorithms/blob/master/leetcode/leetcode/_153_FindMinimumInRotatedSortedArray.java


上一篇 LeetCode.033.Search in Rotated Sorted Array 搜索旋转有序数组

下一篇 面试准备01-Java基础和其他

阅读
评论
586
阅读预计2分钟
创建日期 2018-03-01
修改日期 2020-02-17
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论