夯实算法-搜索插入位置

151 阅读2分钟

题目:搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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<=1041 <= nums.length <= 10^4
  • 104<=nums[i]<=104-10^4 <= nums[i] <= 10^4
  • nums 为 无重复元素 的 升序 排列数组
  • 104<=target<=104-10^4 <= target <= 10^4

解题思路

由题意分析:要在数组中插入目标值,无非是四种情况。

  • 目标值在数组所有元素之前
  • 目标值等于数组中某一个元素
  • 目标值插入数组中的位置
  • 目标值在数组所有元素之后

一个排序数组和一个目标值。这道题要我们做什么?先去看数组中有没有这个目标值,有的话,找到它,返回索引;没有的话,按顺序把它插入到合适位置。

既然给的数组是已经排好序的数组,刚好可以使用二分查找(后面有详细的二分查找解析),去查,查到了就返回索引;查不到就插入到合适位置

将目标值target与中间元素值进行比较: 1.如果target<中间元素:则在前面一半元素中继续寻找 2.如果target=中间元素:匹配成功,找到了 3.如果target>中间元素:则在后面一半元素中继续。

  • 数组元素等于目标值,直接返回下标
  • 数组是升序排列的,如果数组中没有目标值, 遍历时第一个大于目标值的元素就是目标值要插入的位置, 返回下表
  • 若都不符合,目标值则应插到末尾,即下标为数组长度

代码实现

public int searchInsert(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] >= target) {
            return i;
        }
    }
    return nums.length;
}

运行结果

Snipaste_2023-06-30_11-43-37.png

复杂度分析

  • 空间复杂度:O(1)
  • 时间复杂度:O(n)

掘金(JUEJIN) 一起分享知识, Keep Learning!