leetcode 力扣 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

一、采用模板 2

需要查看 当前位置右边位置

采用模板 2 ,因为如果不存在,要插入的位置是尽量靠右的。

另外,加上后处理。

class Solution {
    public int searchInsert(int[] nums, int target) {
        if( nums.length<1 )return 0;
        int i = 0;
        int j = nums.length-1;
        while( i<j ){
            int mid = i+(j-i)/2;
            if( nums[mid]==target ){
                return mid;
            }else if( nums[mid]<target ){
                i = mid+1;
            }else{
                j = mid;
            }
        }
        if( nums[i]<target )return nums.length;
        return i;
    }
}

二、模板1

采用最基础的模板 1 来做,最后如果没有找到,返回 i(left)就可以。

因为,如果不存在目标值,查找到最后一定会有两个位置

a 比目标值小,b 比目标值大。

那么在查找的时候,j 和 i 一定会移动, 最终 i 和 j 相等的位置,不管在 a 还是在 b ,i 都会跑到 b 的位置:

  1. i==j 在 a,那 mid 到了 a ,那i + 1,到了 b 的位置;
  2. i==j 在 b,那mid 到了 b,那j -1i 没变,还是 b 的位置。

所以 返回 i 就是答案。

class Solution {
    public int searchInsert(int[] nums, int target) {
        if( nums.length<1 )return 0;
        int i = 0;
        int j = nums.length-1;
        while( i<=j ){
            int mid = i+(j-i)/2;
            if( nums[mid]==target ){
                return mid;
            }else if( nums[mid]<target ){
                i = mid+1;
            }else{
                j = mid-1;
            }
        }
        return i;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42092787/article/details/107576784