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
相关推荐
wangchunyu1141 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck2 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir2 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人2 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade3 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
2501_944521593 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿3 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521593 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港3 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987373 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化