6. 旋转数组的最小数字

重要

  1. 二分查找的本质是我们获取一个中间元素,然后通过某种方式得知目标元素在其左边或者右边,在有些情况下我们是无法得出判断的,这时候就只能遍历了
  2. 看代码中的注释!!!
/**
 * @Classname Solution
 * @Description 旋转数组的最小数字
 * @Date 2019/12/17 16:07
 * @Created by Cheng
 */
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int left= 0,right = array.length-1;
        while (left < right) {
            int mid = (left+right)>>>1;
            if (array[left] == array[mid] && array[mid] == array[right]) {
                return search(array, left, right);
            }

//            if (array[left] <= array[mid]) {
//                left = mid;
//            } else {
//                right = mid;
//            }

            // ! !!!!!这里为什么要从右边开始判断?
            // 因为,二分查找的判断依据是,排除一个区间,然后找另一个区间,在这个题中,当我们找到一个有序区间后(即left的值小于或等于right)
            // 此时并不能将这个区间排除,因为该区间的最小值依然可能是最终答案,那么如何解决呢?
            // 从右边开始判断,如果右区间是有序的,那我们可以把右区间的最左边的值放入下次判断的区间内,这样就不会丢失它
            // 但是如果从左边,那就莫得办法了
            // 同理,如果题目刚好相反,降序排列的旋转数组,然后找最大值,那就需要从左边开始
            if (array[mid] <= array[right]) {
                right = mid;
            } else {
                left = mid+1;
            }
        }
        return array[left];
    }

    private int search(int[] array, int left, int right) {
        for (int i = left; i <right ; i++) {
            if (array[i] > array[i + 1]) {
                return array[i];
            }
        }
        return array[left];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值