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 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭1 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
XH华1 小时前
初识C语言之二维数组(下)
c语言·算法
暮湫1 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
不想当程序猿_2 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
李小白662 小时前
Spring MVC(上)
java·spring·mvc
落魄君子2 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘