LeetCode刷题记录(二十):搜索插入位置

114 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

搜索插入位置

image.png

题目解析

题目提供素材

根据题目描述,和原始代码,本道题一共提供了两个参数。

  1. 无重复元素的正序数组。

  2. 目标值。

注:正序数组的长度在1到1000之间。

我的解读

根据对本题的了解,我们可以得知最后的预期结果是要获得目标值在正序数组中的排序位置。

要实现这个预期结果的方式有很多,但是这里又要求了时间复杂度。

实现方式一下子就减少了很多,这其中唯有二分法才能更好的实现这道题了。

解题思路

解题思路可以分为两大部分来解决。

  1. 单独解决头部、尾部问题。

  2. 二分法寻找一个合适的位置。

第一步,对比目标值和正序数组中最后一个元素,如果是大于的结果,则应该插入的位置是最后一个元素位置加1,则返回数组的长度。

第二步,和第一步一样,对比目标值和正序数组中的第一个元素。

第三步,则对比目标值是否等于正序数组第一个元素或者最后一个元素。

第四步,开始使用二分法来获取到合适的位置。

二分法就比较简单了,大家可以自行去搜索学习一下。

代码

执行代码如下:

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

执行结果

今天的战绩还算不错,一开始因为返回值存在问题提交错了两次。

image.png