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

力扣HOT100之二分查找:35. 搜索插入位置


这道题属于是二分查找的入门题了,我依稀记得一些二分查找的编码要点,但是最后还是写出了一个死循环,无语(ˉ▽ˉ;)…又回去看了下自己当时的博客和卡哥的视频,这才发现自己分情况只分了两种,最后导致死循环。。。下面直接说思路。本题我们采用左闭右开的二分查找法,左区间的搜索范围为[left, mid),而右区间的搜索范围为[mid, right),我们要确保这两个查找区间在初始状态下覆盖整个数组的元素,因此left初始化为0right初始化为nums.size(),而不是nums.size() - 1,下面来讨论区间的更新情况:

  1. nums[mid] > target时,则右区间内所有的元素都比target大,插入位置应当在左区间内,因此我们将right赋值为mid(因为nums[mid] > target,所以原来的nums[mid]不应包含在区间内,right赋值为mid而不是mid - 1
  2. nums[mid] < target时,则左区间内所有元素都比target小,插入位置应当在右区间内,因此我们将left赋值为mid(因为nums[mid] < target,新的区间不应当继续包含nums[mid]left赋值为mid + 1而不是mid
  3. nums[mid] == target时,说明我们在数组中找到了与target值一样的元素,根据输入样例,我们直接将元素插入当前位置,原来的元素后移一位即可,所以我们直接返回mid
    循环条件是查找区间合法,对于左开右闭的区间,我们必须要保证里面至少有一个元素,因此left不能等于right,必须要保证left < right,左闭右开的区间才是合法的。
    当循环正常结束,一定是数组中没有与target相等的元素,最终触发left == right,退出循环,此时leftright返回哪个都可以,此时nums[left]对应的是数组中第一个大于target的元素,在此处插入,则该位置及以后的元素向后移一位,依然能保证插入后有序。
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size();int mid;//使用左闭右开的找法//左边的查找范围为[left, mid),右边的查找范围为[mid, right)//对于左闭右开的区间,左右端点的差值至少为1才合法while(left < right){mid = (left + right) / 2;if(nums[mid] > target) //插入位置在左区间内right = mid;else if(nums[mid] < target)left = mid + 1;else return mid; }return left;}
};
http://www.lryc.cn/news/2402476.html

相关文章:

  • 使用API有效率地管理Dynadot域名,查看域名市场中所售域名的详细信息
  • IM即时通讯软件,构建企业局域网内安全协作
  • VueScan:全能扫描,高清输出
  • PyCharm项目和文件运行时使用conda环境的教程
  • 第八部分:第五节 - 生命周期与副作用 (`useEffect` Hook):组件的幕后工作
  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)
  • DeepSwiftSeek 开源软件 |用于 DeepSeek LLM 模型的 Swift 客户端 |轻量级和高效的 DeepSeek 核心功能通信
  • Flask-Login使用示例
  • React Hooks 基础指南
  • web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作
  • 沪铜6月想法
  • 网络通信核心概念全解析:从IP地址到TCP/UDP实战
  • Spring 中的disposableBean介绍
  • 【Linux命令学习】获取cpu信息 - lscpu命令学习
  • wordpress免费主题网站
  • Go中的协程并发和并发panic处理
  • Qt Creator工具编译器配置
  • 从零开始的数据结构教程(六) 贪心算法
  • Spring框架学习day7--SpringWeb学习(概念与搭建配置)
  • 打造高效多模态RAG系统:原理与评测方法详解
  • SSM 框架核心知识详解(Spring + SpringMVC + MyBatis)
  • 1.2 fetch详解
  • 【C#】Quartz.NET怎么动态调用方法,并且根据指定时间周期执行,动态配置类何方法以及Cron表达式,有请DeepSeek
  • 02 Deep learning神经网络的编程基础 逻辑回归--吴恩达
  • Android Native 内存泄漏检测全解析:从原理到工具的深度实践
  • React---扩展补充
  • HTML 中 class 属性介绍、用法
  • MySQL的并发事务问题及事务隔离级别
  • ProfiNet 分布式 IO 在某污水处理厂的应用
  • vue2使用笔记、vue2和vue3的区别