LeetCode100之搜索插入位置(35)--Java

server/2025/1/15 13:22:55/

1.问题描述

        给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

        请必须使用时间复杂度为 O(log n) 的算法

        示例1

输入: nums = [1,3,5,6], target = 5
输出: 2

        示例2 

输入: nums = [1,3,5,6], target = 2
输出: 1

        示例3 

输入: nums = [1,3,5,6], target = 7
输出: 4

        提示

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

        难度等级

        简单

        题目链接

        搜索插入位置

2.解题思路

        这道题要求我们在一个排好序的数组中找到目标值,如果目标值不存在,就找出目标值插入的位置索引,对二分查找熟悉的,应该很快就能想到这是一道非常典型的二分查找题目。

        首先,确定左右指针分别为数组的起始索引和末尾索引,然后我们还需要一个中间索引来进行比较二分。在正式进行二分查找之前,我们可以像比较目标值是否小于数组的最小值,如果目标值小于数组的最小值的话,那压根就不用查找了,直接将目标值插入到数组的前面就好了;同样的道理,如果目标值大于数组的最大值,那直接插入在数组的末尾就好了。

java">        //左int left = 0;//右int right = nums.length - 1;//判断是否目标值小于给定数组的最小值if(nums[left] > target){return 0;}//判断是否目标值大于给定数组的最大值if(nums[right] < target){return nums.length;}int mid = 0;

        然后,我们就可以用一个while循环开始开始进行二分查找了,只要左指针小于等于右指针,那么就是还没有查找用,可以不断循环查找逻辑。

java">        //开始二分查找while(left <= right){......}

        首先,我们要更新一下中间索引,这里无论是(右指针-左指针) / 2+左指针 ,还是(左指针+右指针) / 2都可以,两者唯一的不同就是当左右指针都非常大的时候,前者不容易出现数值溢出的情况,而后者容易出现数值溢出的情况。

        接着,比较中间值是否为我们要的目标值,是的话就可以退出二分循环了;

java">            //中间mid = (right - left) / 2 + left;//判断中间值是否等于目标值if(nums[mid] == target){return mid;}

        如果中间值小于我们的目标值,说明我们要找的目标值在中间值右边,所以就要将左指针移动到中间值的下一位,进行下一轮的二分查找,但是在正式进入下一轮之前,我们要进行一个判断,如果此时移动完的左指针所指向的值大于目标值,那么目标值不存在于我们的数组当中,此时要返回目标值插入的位置,也就是中间值的下一位,当前左指针所在的位置。

        举个例子 1 2 4 7 8 ,target= 6,此时如果mid = 2 ,nums[mid] = 4 ,4 < 6,left = mid+1 = 3,nums[left] = 7 ,7 > 6,那么4 < target < 7,所以target 要插在nums[mid] = 4之后,也就是mid+1的位置。

java">            //判断中间值是否小于目标值if(nums[mid] < target){left = mid + 1;//如果更新后的左索引的值大于目标值,说明目标值在数组中不存在if(nums[left] > target){mid = left;break;}}

        如果中间值大于我们的目标值,说明我们要找的目标值在中间值的左边,所以就要将右指针移动到中间值的前一位,进行下一轮的二分查找,但是在正式进入下一轮之前,我们要进行一个判断,如果此时移动完的右指针所指向的值小于目标值,那么目标值不存在于我们的数组中,此时要返回目标值插入的位置,也就是中间值所在的位置。

        举个例子 1 2 4 7 8 ,target= 3,此时如果mid = 2 ,nums[mid] = 4 ,4 > 3,right = mid - 1 = 1,nums[right] = 2 ,2 <  3,那么2 < target < 4,所以target 要插在nums[mid-1] = 2之后,也就是mid的位置。

java">            //判断中间值是否小于目标值if(nums[mid] < target){......}}else{right = mid - 1;//如果更新后的右索引的值小于目标值,说明目标值在数组中不存在if(nums[right] < target){break;}}

        到这里,二分查找的逻辑就结束了,最后将查找到的索引进行返回就可以了。

3.代码展示

java">class Solution {//二分查找public int searchInsert(int[] nums, int target) {//左int left = 0;//右int right = nums.length - 1;//判断是否目标值小于给定数组的最小值if(nums[left] > target){return 0;}//判断是否目标值大于给定数组的最大值if(nums[right] < target){return nums.length;}int mid = 0;//开始二分查找while(left <= right){//中间mid = (right - left) / 2 + left;//判断中间值是否等于目标值if(nums[mid] == target){return mid;}//判断中间值是否小于目标值if(nums[mid] < target){left = mid + 1;//如果更新后的左索引的值大于目标值,说明目标值在数组中不存在if(nums[left] > target){mid = left;break;}}else{right = mid - 1;//如果更新后的右索引的值小于目标值,说明目标值在数组中不存在if(nums[right] < target){break;}}}//返回目标值索引或待插入位置索引return mid;}
}

4.总结

        这道题是一道典型的二分查找题目,唯一可能卡住的地方就是如果目标值不在数组中,怎么确定目标值插入的位置,但其实这个我们只要举两个具体的例子就可以直观的知道怎么解决了。这道题就啰嗦到这里,祝大家刷题愉快~


http://www.ppmy.cn/server/158567.html

相关文章

【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网&#xff1a;www.icmeaae.com 大会时间&#xff1a;2025年3月7-9日 大会地点&#xff1a;中国西安 截稿时间&#xff1a;2025年1月24日23:59 接受/拒稿通知&#xf…

金融项目实战 03|JMeter脚本实现手工接口测试

目录 一、环境说明 1、项目环境搭建 2、Mock说明 二、构造测试数据 1、通过系统页面构造 2、通过接口构造 3、通过数据库构造【推荐】 4、案例&#xff1a;构造借款业务数据 三、JMeter执行接口测试用例 1、获取图片验证码、获取短信验证码 2、注册脚本 3、登录脚本…

《零基础Go语言算法实战》【题目 2-18】获取结构体中字段的 tag 值

《零基础Go语言算法实战》 【题目 2-18】获取结构体中字段的 tag 值 在 Go 语言中&#xff0c;使用 json 包时&#xff0c;在结构体中的字段前会加上 tag&#xff0c;有没有什么办法可以获 取到这个 tag 的内容呢&#xff1f;举例说明。 【解答】 tag 信息可以通过 reflec…

【Matlab 六自由度机器人】机械臂轨迹规划方法总结

机械臂轨迹规划主要方法 前言1. 多项式插值类方法1.1 三次多项式插值数学表达式边界条件求解过程 1.2 五次多项式插值数学表达式边界条件求解过程 2. 基于速度轮廓的方法2.1 梯形速度规划梯形速度规划数学表达式加速段 t ∈ [ 0 , t 1 ] t \in [0,t_1] t∈[0,t1​]&#xff1a…

【练习】力扣热题100 有效的括号

题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括…

K8s数据存储之详解(Detailed Explanation of K8s Data Storage)

K8s数据存储相关概念详解&#xff08;临时存储&#xff0c;节点存储&#xff0c;网络存储&#xff0c;PV/PVC&#xff09; 本篇文章分享一下存储卷和数据持久化的相关概念&#xff1a; 存储卷概述 临时存储卷&#xff08;Ephemeral Volumes&#xff09; 节点存储卷&#xff…

SSE部署后无法连接问题解决

1. 问题现象 通过域名访问 https://api-uat.sfxs.com/sse/subscribe?tokenBearer%20eyJUxMiJ9.eyJhY2NvdW50IjoiYWRtaWZ0NvZGUiOiIwMDEiLCJyb2xidXNlcm5hbWUiOiLotoXnuqfnrqHnkIblkZgifQ.tlz9N61Y4 一直无法正常连接 2. 问题解决 nginx.conf进行配置 server {location /ss…

面向科研狗的服务器运维——服务器搭建维护到排障

系列文章目录 写在前面&#xff1a;某高校的苦逼计算机博士生。因为之前在高性能计算国家重点实验室做工程师&#xff0c;也负责了当时的超算节点的部分运维工作&#xff0c;所以现在也承担了组里的服务器运维工作。 文章目录 系列文章目录前言一、pandas是什么&#xff1f;…