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 变量)。
相关推荐
深度学习机器1 天前
RAG Chunking 2.0:提升文档分块效果的一些经验
人工智能·算法·llm
keke_俩个科1 天前
实战派 JMeter 指南:核心功能、并发压测实操与常见问题解决方案
java·jmeter·spring·spring cloud·tomcat
青鱼入云1 天前
IDEA源码阅读神器-Diagram工具
java·ide·intellij-idea
占疏1 天前
访问日志查询功能
java·服务器·flask
星光一影1 天前
Java版社交系统/聊天系统/im/即时通信/社交通讯
java·spring boot·mysql·交友
努力学习的小全全1 天前
【CCF-CSP】05-01数列分段
数据结构·算法·ccf-csp
R.lin1 天前
对接物联网使用netty通信与MQTT之间的区别
java·物联网
AI_56781 天前
CI/CD自动化部署革命:“三分钟流水线“背后的工程实践
java·开发语言·人工智能·ai·neo4j
遗憾是什么.1 天前
数据结构 -- 栈
数据结构·算法·链表
清风er1 天前
智能座舱开发
算法·计算机视觉