vlambda博客
学习文章列表

图解 | Leetcode #35 搜索插入位置

👇👇 关注后回复 “进群” ,拉你进程序员交流群 👇👇
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
0篇原创内容
Official Account
图解 | Leetcode #35 搜索插入位置
算法专栏
算法专栏,每日推送。算法是程序员内功,分享算法知识、文章、工具、算法题、教程等
0篇原创内容
Official Account
作者丨微木
来源丨编程狂想曲

你好,我是微木。
今天分享的内容是LeetCode 35.搜索插入位置这个题目。
题目描述:

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

你可以假设数组中无重复元素。

示例1:

输入: [1,3,5,6], 5

   
     
     
   
输出: 2

示例2:

输入: [1,3,5,6], 2

输出: 1
思路分析
二分查找法在每次查找之后,会将查找区间缩小一半。要写出正确的二分查找法,需要明确:
一是查找区间的定义。左闭右闭区间[left,right]表示区间内的所有元素都要考察;左闭右开区间[left,right)表示right所指的元素不在考察范围内。
不同的定义方式,循环结束的条件是不一样的。 对于左闭右闭区间[left,right]来说,循环结束的条件是left>right;对于左闭右开区间[left,right)来说,循环结束的条件是left==right。
二是新一轮搜索的区间。新一轮的搜索区间是由上一步区间的定义来决定的。
当区间的定义是左闭右闭区间[left,right]时:
如果target小于mid所指向的值,则表示接下来要在左半部分查找,这时由于mid所指的值已经考察过了,所以right=mid-1,即新的区间是[left,mid-1];
如果target大于mid所指向的值,则表示接下来要在右半部分查找,这时由于mid所指的值已经考察过了,所以left=mid+1,即新的区间是[mid+1,right]。
   
     
     
   
当区间的定义是左闭右开区间[left,right)时:
如果target小于mid所指向的值,则表示接下来要在左半部分查找,这时由于mid所指的值已经考察过了,新一轮的搜索中mid所指的值不用考察,所以right=mid,即新的区间是[left,mid);
如果target大于mid所指向的值,则表示接下来要在右半部分查找,这时由于mid所指的值已经考察过了,而区间左边是闭区间,所以left=mid+1,即新的区间是[mid+1,right)。
接着,基于这两种区间的定义,我们看下如何用二分查找法解答该题目。

01

左闭右闭区间[left,right]

基于上述的分析,我们知道对于左闭右闭区间来说,循环结束时,left>right。由于,数组是升序排好的,所以当目标值在数组中不存在时,left所指向的位置即为目标值应该插入的位置。
具体可参考如下动画演示:
图解 | Leetcode #35 搜索插入位置

代码实现:

图解 | Leetcode #35 搜索插入位置


02

左闭右开区间[left,right)

基于上述的分析,我们知道对于左闭右开区间来说,循环结束时,left==right。这时由于left==right,所以当目标值在数组中不存在时,left或right所指向的位置即为目标值应该插入的位置。
具体可参考如下动画演示:
图解 | Leetcode #35 搜索插入位置

代码实现:

图解 | Leetcode #35 搜索插入位置


-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

图解 | Leetcode #35 搜索插入位置

程序员直聘
程序员直聘,一个程序员找工作平台。
21篇原创内容
Official Account
点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓