Leecode#35刷题之搜索插入位置

题目

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

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

Java代码

java 复制代码
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return left;
    }
}

核心思路: 标准二分查找。找到了就返回下标,没找到循环结束时 left 就是该插入的位置。


逐行说明:

java 复制代码
int left = 0, right = nums.length - 1;

标准二分框架,left 从 0 开始,right 从末尾开始。

java 复制代码
while (left <= right) {

int mid = left + (right - left) / 2;

left + (right - left) / 2 等价于 (left + right) / 2,但避免整数溢出。

java 复制代码
if (nums[mid] == target) {

return mid; // 找到了,返回下标

} else if (nums[mid] < target) {

left = mid + 1; // 太小,往右找

} else {

right = mid - 1; // 太大,往左找

}

标准二分查找逻辑。

java 复制代码
return left;

关键 :没找到时,循环结束 left > right,left 就是 target 应该插入的位置。


为什么没找到时 left 就是插入位置?

以 nums = [1,3,5,6], target = 2 为例:

轮次 left right mid numsmid 操作
1 0 3 1 3 3>2, right=0
2 0 0 0 1 1<2, left=1
退出 1 0 left > right
复制代码
nums: [1, 3, 5, 6]
           ↑
        left=1 (插入位置)

2 应该插在 1 和 3 之间,下标 1 ✓

循环结束时 left 停在第一个大于 target 的位置,正好就是插入位置。


三个示例演示:

target 过程 结果
5 mid=1→3<5, mid=2→5==5 返回 2 ✓
2 mid=1→3>2, mid=0→1<2, left=1 返回 1 ✓
7 mid=1→3<7, mid=2→5<7, mid=3→6<7, left=4 返回 4 ✓

时间复杂度 O(log n),空间复杂度 O(1)。

python代码

python 复制代码
class Solution(object):
    def searchInsert(self, nums, target):
        left, right = 0, len(nums) - 1

        while left <= right:
            mid = left + (right - left) // 2

            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1

        return left
相关推荐
念何架构之路1 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
惊讶的猫1 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式2 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
晒太羊的猫2 小时前
hot100动态规划刷题
算法·动态规划
\光辉岁月/2 小时前
7.javase-面向对象
java·开发语言
Είναι η κοπέλα2 小时前
显存计算与模型选择:你的显卡能跑多大的模型
人工智能·pytorch·python·开源·conda
weixin_531094692 小时前
heap_4内存管理
java·开发语言·算法
ROSF68682 小时前
2026 仿石漆乳液供应商:市场布局与行业发展态势梳理
大数据·人工智能·python
余额瞒着我当琳3 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法