LeetCode刷题笔记 ~ 35. 搜索插入位置

160 阅读2分钟

这是我参与更文挑战的第7天,活动详情查看:更文挑战

35. 搜索插入位置

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

你可以假设数组中无重复元素。

示例

示例 1:
输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

输入: [1,3,5,6], 0
输出: 0

个人思路解析

方式一:暴力法

直接遍历数组,找到目标值对应的位置,返回结果

class Solution {
    public int searchInsert(int[] nums, int target) {
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            // 根据需求给出相应判断条件
            if (nums[i] >= target){
                // 当当前元素为目标值或者大于目标值,则返回当前索引值
                return i;
            }
        }
        // 全部不符合则目标值大于数组中所有元素,返回数组末尾数索引值 +1
        return nums.length;
    }
}

复杂度分析

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

提交结果

image.png

方式二:二分查找

暴力法虽然简单,不过当数据量逐渐增大的时候,相对应的执行耗时也会大大提升,对于一个有序的数组来说,我们可以使用二分查找来进行一个优化

class Solution {
    public int searchInsert(int[] nums, int target) {
        // 定义两个指针分别指向数组的首位与末尾
        int left = 0;
        int right = nums.length - 1;
        // 判断目标值是否大于数组末尾元素
        if (target > nums[right]){
            // 大于则直接返回末尾索引值 +1
            return nums.length;
        }
        // 当left大于或等于right时证明已对比完数组中元素,结束循环
        while (left < right){
            // 定义中间值
            int mid = left + (right - left) / 2;     
            // 判断中间值是否等于目标值
            if (nums[mid] == target){
                // 返回当前索引值
                return mid;
            }else if(nums[mid] < target){
                // 当前元素小于目标值,指针右移(最终结果为要插入的位置,这里记得要 +1)
                left = mid + 1;
            }else{
                // 指针左移
                right = mid;
            }
        }

        // 返回最终剩余目标索引值
        return left;
    }
}

复杂度分析

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

提交结果

image.png

题目来源力扣:leetcode-cn.com/problems/se…