Java二分法查找

本文探讨了如何运用二分查找算法解决旋转数组中寻找最小数字的问题。通过比较查找关键字与中间关键字的关系,逐步缩小搜索范围。在代码实现中,避免了整型越界,并处理了旋转点可能在mid处的情况。此外,还提到了暴力遍历的解决方案作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分法查找过程:

  1. 找到中间的关键字
  2. 比较查找的关键字与中间关键字的大小关系
  3. 如果相等,那么就算是已找到
  4. 如果查找的关键字小于中间的关键字则在前半部分进行同样的存储
  5. 如果查找的关键字大于中间的关键字则在后半部分进行同样的存储

二分法查找要求:

  1. 顺序存储
  2. 元素有序

剑指offer11. 旋转数组的最小数字
在这里插入图片描述

class Solution {
    public int minArray(int[] numbers) {
        int left = 0;
        int right = numbers.length - 1;
        if(right == 0){
            return numbers[0];
        }
        while(left < right){
            int mid = left + (right - left) / 2;//防止出现越界问题
            if(numbers[mid] > numbers[right]){//说明旋转点在mid右边
                left = mid + 1;
            }else if(numbers[mid] < numbers[right]){//说明旋转点在mid左边
                right = mid;
            }else if(numbers[mid] == numbers[right]){
                right--;//从最右边-1遍历
            }
        }
        return numbers[left];
    }    
}

Tips:

  1. 为什么上述代码中是int mid = left + (right - left) / 2;而不是二分法中常见的int mid = (left + right) / 2;
    如果是int mid = (left + right) / 2;的话会在left和right两者较大时发生整型越界

  2. 为什么上述代码中是right = mid;而不是二分法中常见的right = mid - 1;
    如果是right = mid - 1;的话可能会漏掉mid这个值,有可能mid就是旋转点,即题目中所要求返回的值

  3. 此题还有一种解法就是暴力解法,即从下标为0的元素开始遍历,每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一个元素为最小元素,如果查到最后一个元素没有出现上述元素,则下标为0的元素为最小元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值