leetcode 35. Search Insert Position

Given a sorted array 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 may assume no duplicates in the array.

Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0

和上一题一样 都是二分查找的变形
这个题和普通二分查找的区别仅在于 目标值不存在的时候并不是返回-1 而是返回当前ij汇合的值就行了

public int searchInsert(int[] nums, int target) {
        int i = 0;
        int j = nums.length -1;
        int mid = (i + j) / 2;
        while(i <= j){
            mid = (i + j) / 2;
            if(nums[mid] < target){
                i = mid + 1;
            }
            else if(nums[mid] > target){
                j = mid - 1;
            }
            else{
                return mid;
            }
        }
        if(target > nums[mid]) return mid+1;
        else return mid;
    }
    发现这些题目 循环条件到底是
    >= 还是>真是最最重要的事 这些情况我一般都不仔细思考 
    发现没A就加个=再试试 真是不好的习惯 今天就整理一下边界的考虑

回顾一下
循环的跳出情况:

        --------------------------------------------
        i    j
        mid
        -------------------------------------------
        此时如果target<v[mid] 那么就会变成 (j = mid - 1)
   j    i
        mid                                (跳出循环)
        --------------------------------------------
        如果target>v[mid] 那么就会变成 (i = mid + 1)
              ij
        mid
        --------------------------------------------
        然后考虑大循环的跳出条件:
        如果设置为:i<j 那么此时就一定会跳了
        但是这样设置 没过用例[1,3] 4 看看target>v[mid]的情况
        就会看到 此时只判断了 target比mid大 也许target还比j大呢
        所以此时还不能跳出 应该进一步:
        --------------------------------------------
        ij     
        mid
        --------------------------------------------
    j   i                                  
        mid                             (跳出循环)         
        --------------------------------------------
        j    i     
        mid                             (跳出循环)
        --------------------------------------------

边界问题 带不带等于号都很重要!!!!!!!!!!!
仔细考虑!!!!!!!!!!!!!!!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值