力扣35-搜索插入位置

尝试去做力扣第35题:搜索插入位置

这道题可以转化为寻找数组中最小的大于等于 target 的值的位置。

因此可以将数组分成两个部分,左部分是小于 target 的值,右部分是 大于等于 target 的值。这道题数组中的元素具有二段性,可以采用二分法,利用 left 和 right 逐渐逼近结果值并且在结果值处会合。

这道题要注意以下细节:(n 为数组长度)

  • 因为使用 [left, right] 进行二分法,所以 left 初始化为 0, right 初始化为 n - 1
  • 注意,这道题与传统的二分法不同,使用 left <= right 会进入死循环!因为左部分是小于 target 的值, 右侧是大于等于 target 的值,所以要使 left 和 right 在目标位置会和,left 指针始终都在尝试“跳出”左部分,而right 指针要留在右部分,因此 left < right 时进入循环即可,而 left <= right 会陷入死循环。
  • 如上条所讲,left 要跳出左部分, 当 nums[mid] < target 时,left = mid + 1,而 right 要留在右部分,所以当 nums[mid] >= target 时,right = mid。
class Solution {
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        if(target > nums[n - 1]) return n;
        int left = 0, right = n - 1;
        while(left < right) {
            int mid = left + ((right - left) >> 1);
            if(nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值