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 变量)。
相关推荐
天上掉下来个程小白几秒前
开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
java·运维·spring boot·后端·nginx·负载均衡·苍穹外卖
lizz313 分钟前
机器学习中的线性代数:奇异值分解 SVD
线性代数·算法·机器学习
试着生存3 分钟前
java根据List<Object>中的某个属性排序(数据极少,顺序固定)
java·python·list
_星辰大海乀4 分钟前
LinkedList 双向链表
java·数据结构·链表·list·idea
MSTcheng.7 分钟前
【C语言】动态内存管理
c语言·开发语言·算法
不去幼儿园11 分钟前
【启发式算法】Dijkstra算法详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法·图搜索算法
小韩学长yyds15 分钟前
Java调用第三方HTTP接口:从入门到实战
java·开发语言·http
苏十八18 分钟前
JavaEE Servlet02
java·服务器·网络·java-ee·json
serve the people20 分钟前
神经网络中梯度计算求和公式求导问题
神经网络·算法·机器学习
爬菜22 分钟前
异常(5)
java