2. 35 搜索插入位置(easy)

一、题目

Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.

 

Example 1:

Input: nums = [1,3,5,6], target = 5
Output: 2
Example 2:

Input: nums = [1,3,5,6], target = 2
Output: 1
Example 3:

Input: nums = [1,3,5,6], target = 7
Output: 4
 

Constraints:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums contains distinct values sorted in ascending order.
-104 <= target <= 104

二、 思路

有序数组+没有重复元素。二分查找,对半找就完事儿了。
改变1:然后二分查找最开始判断越界的结果要改变,假如说target比最小的还小,那就在最前面插入;假如说target比最大的还大,那就在最后面插入。
改变2:假如说最后找不到,要返回的是left,也就是说最小的位置插入,而不是返回mid。

二、自己写的

1.代码

第一次写

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

//错误1:假如说最后找不到,要返回的是left或者right+1(很简单,自己找个情况一画就能知道)

第二次写

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

//正确,把最后的return mid改成return left或者return right + 1

三、标准答案

1.方法一(左闭右闭)

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        int mid = 0;

        if (nums[left] > target)
            return 0;
        else if (nums[right] < target)
            return nums.length;

        while (left <= right) {
        	//注意写法,mid = (left + (right - left)) >> 1;错了,只需要把后面除二就行了
            mid = left + ((right - left) >> 1);
            if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
            else
                return mid;
        }

        return right + 1;
        //return left;
    }
}

2.方法二(左闭右开)

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length;
        int mid = 0;

        if (nums[left] > target)
            return 0;
        else if (nums[right - 1] < target)
            return right;

        while (left < right) {
            mid = left + ((right - left) >> 1);
            if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid;
            else
                return mid;
        }

        //return right;
        return left;
    }
}

3.总结

左闭右开和左开右闭就看当时right是咋定义的,然后根据定义,下面不同情况对应不同情况,注释写的很明白,以后就按这个来。
这个题得再加上最后找不到的时候返回啥(return的不是-1),找个例子,写一下就知道了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值