LeetCode35:搜索插入位置

原题地址:. - 力扣(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
  • 边界检查 :循环结束后,检查 startend 指针位置是否为 target,如果是,则返回对应索引。
  • 确定插入位置 :如果没有找到 target,则检查 target 应插入的位置。若 target 小于 nums[end],则插入位置在 startstart + 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 在右半部分,缩小左边界
            }
        }
        
        // 边界检查,确保是否找到 target
        if (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 + 1
            return end + 1;
        }
    }
}

复杂度分析

  • 时间复杂度:O(log n),因为使用了二分查找,每次循环将查找范围减半。
  • 空间复杂度 :O(1),仅使用了常数级别的额外空间(startendmidd 变量)。
相关推荐
.生产的驴5 分钟前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV12 分钟前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
知来者逆14 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
晨集14 分钟前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城17 分钟前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
阿让啊19 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北20 分钟前
力扣-160.相交链表
算法·leetcode·链表
椰羊~王小美24 分钟前
LeetCode -- Flora -- edit 2025-04-25
java·开发语言
凯酱32 分钟前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis
程序员总部42 分钟前
如何在IDEA中高效使用Test注解进行单元测试?
java·单元测试·intellij-idea