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

1.1题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5]
输出: 1
输入: [2,2,2,0,1]
输出: 0

1.2解析

首先最容易想到的就是暴力解法,遍历一遍数组找到最小值就好了。进阶的解法就是二分法。不过二分法需要注意:如何判断左右边界的移动

  • 当 numbers[mid] > numbers[right]时: mid一定在左排序数组中,因此执行 left = min+1;
  • 当 numbers[mid] > numbers[right] 时: mid一定在右排序数组中,因此执行 right= min;
  • 当 numbers[mid] == numbers[right] 时: 无法mid在哪个排序数组中,执行 right =right-1缩小判断范围;

1.3代码

暴力解法

package solution;


/**
 * @author xgj
 */
public class Solution {
    public int minArray(int[] numbers) {
        int min = Integer.MAX_VALUE;
        for(int value : numbers){
            min = Math.min(min,value);
        }
    return min;
    }
}

二分法解法

package solution;


/**
 * @author xgj
 */
public class Solution {
    public int minArray(int[] numbers) {
        int left = 0;
        int right = numbers.length-1;
        while(left<right){
            int mid = left+(right-left)/2;
            if (numbers[mid] > numbers[right]) {
                left= mid + 1;
            } else if (numbers[mid] < numbers[right]) {
                right = mid;
            } else {
                right--;
            }

        }
        return numbers[left];
    }
}
posted @ 2020-07-22 08:49  大嘤熊  阅读(95)  评论(0编辑  收藏  举报