LeetCode35:搜索插入位置

devtools/2024/11/14 1:04:13/

原题地址:. - 力扣(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

提示:

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

解题思路

  • 初始化:如果数组为空或 null,返回 -1,表示无法查找。否则,初始化 start 为 0,end 为数组长度减一。
  • 二分查找:在 start + 1 < end 的条件下进行循环。取中间索引 midd = start + (end - start) / 2
    • 如果 nums[midd] == target,则返回 midd
    • 如果 nums[midd] > target,说明 target 在左半部分,因此将 end 更新为 midd
    • 否则,将 start 更新为 midd
  • 边界检查:循环结束后,检查 start 和 end 指针位置是否为 target,如果是,则返回对应索引。
  • 确定插入位置:如果没有找到 target,则检查 target 应插入的位置。若 target 小于 nums[end],则插入位置在 start 或 start + 1 处;否则,在 end + 1 处

源码实现

java">class Solution {public int searchInsert(int[] nums, int target) {// 检查数组是否为空if (null == nums || nums.length == 0) {return -1; // 若为空数组,返回 -1 表示无效输入}int start = 0; // 左指针int end = nums.length - 1; // 右指针int midd; // 中间指针// 二分查找,当 start 和 end 相邻时退出循环while (start + 1 < end) {// 防止 start + end 直接相加可能导致的整型溢出midd = start + (end - start) / 2;if (nums[midd] == target) {return midd; // 找到目标,返回其索引} else if (nums[midd] > target) {end = midd; // target 在左半部分,缩小右边界} else {start = midd; // target 在右半部分,缩小左边界}}// 边界检查,确保是否找到 targetif (nums[start] == target) {return start; // target 在 start 索引}if (nums[end] == target) {return end; // target 在 end 索引}// 判断 target 的插入位置if (target < nums[end]) {// target 应插入到 start 或 start + 1 的位置return nums[start] < target ? start + 1 : start;} else {// target 大于 end 位置元素,应插入到 end + 1return end + 1;}}
}

复杂度分析

  • 时间复杂度:O(log n),因为使用了二分查找,每次循环将查找范围减半。
  • 空间复杂度:O(1),仅使用了常数级别的额外空间(startendmidd 变量)。

http://www.ppmy.cn/devtools/133282.html

相关文章

泉州市工业和信息化局关于开展排查运维安全管理系统安全漏洞的通知

文章目录 引言附件1: 受影响版本和修复方案附件2:漏洞排查处置情况反馈表引言 接国家网络与信息安全信息通报中心通报,一款由北京圣博润高新技术股份有限公司研发的运维安全管理系统(俗称堡垒机)存在命令执行漏洞(CNVD-C-2024-781563、NVDB-CNVDB-2024768604)。攻击者可…

使用k8s管理应用以及java案例

使用k8s管理应用 制作镜像控制器管理podpod数据持久化创建service四层代理创建ingress规则对外发布应用日志与监控应用案例(因无开发代码&#xff0c;最终跑不起来)编写java代码编写 Dockerfile构建 Docker 镜像在 Kubernetes 上运行应用程序创建 Kubernetes 服务service创建in…

Android 如何实现不编译指定的apk,不加载系统应用

1.把Android.mk改为Android.mk_bak 2.删除当前Android.mk内容变为空mk 或者注释掉里面所有内容 3.以上方法存在些许问题&#xff0c;因为只是把当前的mk屏蔽了&#xff0c;但其他路径的类似应用也会编译进去。 在内置应用mk下添加需要覆盖的应用&#xff0c;这个比较全面&…

Oracle 23AI创建示例库

一、示例库介绍 多年来&#xff0c;Oracle 一直使用简单的数据库模式 SCOTT 及其两个突出的表 EMP 和 DEPT&#xff0c;用于文档和培训中的各种示例。但不少小伙伴并不知道如何创建这些示例数据&#xff0c;其实Oracle官方上就有提供对应的方法&#xff0c;本文就带领大家完成…

关于vue生命周期

父子组件生命周期执行顺序&#xff1f; v2 v3 父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted Vue2生命周期 Vue3生命周期 beforeCreate setup created created befor…

乐尚代驾十订单支付seata、rabbitmq异步消息、redisson延迟队列

账单信息 司机结束代驾之后&#xff0c;生成账单&#xff08;包含账单信息和分账信息&#xff09;司机发送账单给乘客乘客获取账单之后&#xff0c;进行支付 获取账单信息 order_bill表记录的账单信息&#xff0c;我们直接获取即可 Operation(summary "根据订单id获取…

JavaScript:loadScript 方法

一、loadScript 解释 在JavaScript中&#xff0c;loadScript 方法通常用于动态地加载一个外部JavaScript脚本。这种方法常用于需要根据某些条件&#xff08;如用户交互、页面加载完成后的某些操作等&#xff09;动态引入脚本的场景。 二、实现代码 function loadScript(url,…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …