LeetCode 154. 寻找旋转排序数组中的最小值 II

154. 寻找旋转排序数组中的最小值 II

题目

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。

找到其中最小的元素。

注意数组中可能存在重复的元素。

示例 1:

输入: [1,3,5],
输出: 1

示例 2:

输入: [2,2,2,0,1],
输出: 0

思路

需要在无重复的旋转数组中注意一个地方:在middle 和 end 相等的时候,让 end 自减 1 即可;

代码

class Solution {
    public int findMin(int[] nums) {
               if (nums == null || nums.length == 0)
            return 0;

        int start =0;
        int end = nums.length-1;
        //第一个数小于最后一个数,说明是完全升序
        if (nums[start]<nums[end])
            return nums[start];

        int middle=0;
        while (start<=end){
             middle = start +(end-start)/2; //需要保证不能 int 相加出现溢出

            //让中位数和右边的数字比较
            if (nums[middle]>nums[end]){
                start = middle+1;
            }
            //如果 end = middle-1 的话,不能通过 {3,1,2}
            else if (nums[middle]<nums[end]){
                end = middle;//因为这里的 end 可能就是最小值,不能加一
            }
            //如果中间和最后相等。怎么查找,主要前后移动方向不确定
            //无法确定的时候,让 右边的值自减就好了
            else {
                end--;
            }
        }
            return nums[start]; 
    }
}
原文地址:https://www.cnblogs.com/HuanChen1025/p/8999274.html