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

LeetCode搜索插入位置

题目描述

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

请必须使用时间复杂度为 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

解题思路

二分查找的时间复杂度是 O(log n),其中 n 是数组的长度。所以可实现一个二分查找算法,用于在排序数组中查找一个目标值,并返回目标值的索引或者它应该被插入的位置。

代码

/*** @param {number[]} nums* @param {number} target* @return {number}*/
var searchInsert = function(nums, target) {let left = 0, right = nums.length - 1; // 闭区间 [left, right]while (left <= right) { // 区间不为空// 循环不变量:// nums[left-1] < target// nums[right+1] >= targetconst mid = Math.floor((left + right) / 2);if (nums[mid] < target) {left = mid + 1; // 范围缩小到 [mid+1, right]} else {right = mid - 1; // 范围缩小到 [left, mid-1]}}return left;
}

代码分析

  1. 初始化两个指针 leftright,分别指向数组的起始和结束位置,形成一个闭区间 [left, right]

  2. 进入一个 while 循环,条件是 left 小于等于 right,即区间不为空。

  3. 在循环内部,计算中间位置 mid,使用 Math.floor((left + right) / 2) 来确保 mid 是一个整数。

  4. 比较 nums[mid]target 的值:

    • 如果 nums[mid] 小于 target,则说明 target 可能在 mid 的右侧,因此更新 leftmid + 1,这样新的搜索区间就变成了 [mid + 1, right]
    • 如果 nums[mid] 大于或等于 target,则说明 target 可能在 mid 的左侧或 mid 本身,因此更新 rightmid - 1,这样新的搜索区间就变成了 [left, mid - 1]
  5. while 循环结束时,left 指针将指向 target 应该被插入的位置。如果 target 在数组中存在,left 将指向 target 的索引;如果 target 不存在,left 将指向 target 应该被插入的位置,以保持数组的排序。

  6. 最后,函数返回 left 作为结果。

这个算法的关键在于,每次迭代都会将搜索区间减半,这是通过比较中间元素和目标值来实现的。如果目标值在数组中,算法最终会找到它;如果目标值不在数组中,算法会找到目标值应该被插入的位置,以保持数组的排序。

这里可以自行走一遍示例,因为最后返回的是left,而判断最后是因为right减少导致循环结束,所以得到正确结果

http://www.lryc.cn/news/463146.html

相关文章:

  • UE5学习笔记24-添加武器弹药
  • 限制游客在wordpress某分类下阅读文章的数量
  • Oracle云主机申请和使用教程:从注册到SSH连接的全过程
  • 芯知识 | NVH-FLASH语音芯片支持平台做语音—打造音频IC技术革新
  • 机器学习——解释性AI与可解释性机器学习
  • 中国全国省市区县汇总全国省市区json省市区数据2024最新
  • [Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器
  • 路由器原理和静态路由配置
  • UE5 使用Animation Budget Allocator优化角色动画性能
  • Element UI 组件库详解:从入门到精通
  • JavaScript 事件循环(EventLoop) —— 浏览器 Node
  • 【ROS2】订阅手柄数据,发布运动命令
  • WinX86内核02-驱动程序
  • 基于SpringBoot+Vue的体育馆场地预约系统
  • 【WebGIS】Cesium:天地图加载
  • [产品管理-46]:产品组合管理中的项目平衡与管道平衡的区别
  • 【MySQL】MySQL的简单了解详解SQL分类数据库的操纵方法
  • 【Python爬虫实战】正则:从基础字符匹配到复杂文本处理的全面指南
  • 10.18Python基础迭代器生成器_函数式编程
  • HttpPost 类(构建 HTTP POST 请求)
  • xtu oj 原根
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • Visual Studio--VS安装配置使用教程
  • 什么叫CMS?如何使用CMS来制作网站?
  • 如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口
  • 牛客小白月赛102:最短?路径(分层bfs)
  • JSON字符串转成java的Map对象
  • 重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)
  • STL源码剖析:Hashtable
  • spring-boot学习(2)