力扣35. 搜索插入位置

136 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

描述

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

请必须使用时间复杂度为 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
  • 示例4
输入: nums = [1,3,5,6], target = 0
输出: 0
  • 示例5
输入: nums = [1], target = 0
输出: 0
  • 提示:
  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为无重复元素的升序排列数组
  • -104 <= target <= 104

解析

大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件,因此毫无疑问比较好的算法是二分法来解答,但是需要注意的是,如果题目强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下表可能不是唯一的。

这道题目其实难度一般,看完题目,要在数组中插入目标值,总结有以下这四种情况。

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

复杂度:

  • 时间复杂度:O(logn),n为数组中元素数量。
  • 空间复杂度:O(1)。

示例

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left =0;
        int right = nums.length-1;
        int result =nums.length;
        while(left<=right){
            int mid = ((right - left) >> 1) + left;
            if (target <= nums[mid]) {
                result = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }
}

运行结果:

执行结果:通过

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:38.1 MB, 在所有 Java 提交中击败了41.16%的用户