当前位置: 首页 > article >正文

[leetcode]704.二分查找-简单

704. 二分查找

题目:给定n个元素升序的整形数组nums和一个目标值target

要求:写一个搜索函数搜索整形数组nums中的target,如果目标值存在则返回下标,否则返回-1.。

Class Solution{
    public int search(int[] nums, int target){
        
    }
}

Class Solution{
	public int search(int[] nums, int target){
		//如果目标值小于数组的最小值,或者目标值大于数组的最大值 返回-1
		if(target < nums[0] || target > nums[nums.length-1]){
			return -1;
		};
        int left = 0;
        int right = nums.length - 1;
		//进行二分查找,最终的条件是left和right是否交叉
		//——>如果数组只有一个元素,那么会出现死循环的情况
		if(left <= right){
			mid = left + ((right - left)>>1);//——>1.如果是mid = (left + right)/2;测试集过大出现超过int的数据范围的情况。
		}else if(target == nums[mid]){//如果刚好mid值等于目标值
			return 1;
		}else if(target > nums[mid]){
			left = mid + 1;//2.这里+1,为什么不是left = mid?——>如果是单个元素的时候就进入了死循环
		}else{//等价于target < nums[mid]
			right = mid - 1;
		}
	}
	return -1;//如果以上条件都不满足,那么说明target是属于头尾数组元素范围之内,但不属于数组中的任何一个元素,所以返回-1。
}

题解:

class Solution {
    public int search(int[] nums, int target) {
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (target == nums[mid]) {
                return mid; // 最后返回下标
            } else if (target > nums[mid]) {
                left = mid + 1;
            } else if (target < nums[mid]) {
                right = mid - 1;
            }

        }
        return -1;
    }

}

一、mid = (left + right)/2 出现超过int范围问题

如果在确定mid的时候,测试集的nums数组元素过大,会出现超过int范围问题。

二、出现数组越界

 如果所有条件都不满足,那么说明target是属于头尾数组元素范围之内,但不属于数组中的任何一个元素,所以返回-1。

举例:比如数组为[10, 20, 30, 40],目标值为25。这时候二分法在查找过程中,中间元素是20或30,然后继续查找,直到循环结束,未找到,返回-1。

四、结束条件:left和right交叉

其他写法可能出现的问题:

为什么是left = mid + 1;或者是right = mid -1;?为什么不用left = mid;或者right = mid?——>会出现死循环

因为如果nums数组,如果只有一个元素,那么left和right都指向同一个元素,那么让left = mid后,left的值还是没有改变,陷入死循环。


http://www.kler.cn/a/572017.html

相关文章:

  • 【Canny 边缘检测详细讲解】
  • 【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
  • 统计URL出现层级及次数
  • 2025-03-04 学习记录--C/C++-C语言 判断是否是素数
  • C# .NETCore ZipArchive 处理大容量文件导致内存占用高的问题
  • 【YOLO12全网首发】训练+测试行人摔倒
  • json介绍、python数据和json数据的相互转换
  • 华为 VRP 系统简介配置SSH,TELNET远程登录
  • Kubernetes Pod 管理及优化
  • 利用出书策略结合定制开发开源AI智能名片S2B2C商城小程序获取私域流量的探索
  • vue实例
  • 通配符匹配在Redis中的实现
  • AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
  • [Web 安全] PHP 反序列化漏洞 —— PHP 魔术方法
  • CSS Overflow 属性详解
  • 千里科技亮相吉利AI智能科技发布会,共启“AI+车”新纪元
  • Asp.Net Core WebAPI开发教程(入门)
  • 机器人训练环境isaac gym以及legged_gym项目的配置问题
  • JAVA实战开源项目:租房管理系统(Vue+SpringBoot) 附源码
  • 17 款电脑压缩工具详解及下载指南(2025 年最新版)