二分查找------练习1

1. 题目

在这里插入图片描述

2. 思路和题解

这道题和81题其实很像,也是用二分查找进行求解。也是需要在原二分查找的基础上缩减范围。

  1. 首先和二分查找大体思路一样,分别定义左右两个位置left和right,然后mid为left + (right - left) / 2
  2. 接下来就是三种情况:
  • 如果中间值大于右边的值,即numbers[mid] > numbers[right],这个时候说明最小值肯定在mid的右边,所以将mid + 1赋值给left
  • 如果中间值小于右边的值,即numbers[mid] < numbers[right],这个时候说明最小值肯定在mid的左边,但是这里不能像上面一样,将mid - 1赋值给right,因为mid这个位置的元素可能就是最小的,所以不能直接排除,需要先留下来
  • 如果中间值等于右边的值,即numbers[mid] = numbers[right],这个时候虽然没办法像上面一样确定最小值在mid的左边还是右边,但是我们可以将right值减1,这样起到缩小范围的作用,并且没有将mid排除,所以对结果是没有影响的

所以整体的代码如下:

class Solution {
    public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > nums[right]) {
                left = mid + 1;
            } else if (nums[mid] < nums[right]) {
                right = mid;
            } else {
                right--;
            }
        }
        return nums[left];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值