教林算法-二分法(二)

联想 “0~n-1中缺失的数字” 和 “第 k 个缺失的正整数”之间的联系。

1. 0~n-1中缺失的数字

在这里插入图片描述- 又回到了这道题,在这里是不是可以将value 和 index联系在一起,如果没有缺失arr[index] = index, 在缺失的左边都符合条件arr[index] = index, 在缺失的右边都符合条件arr[index] > index;

var missingNumber = function(nums) {
    let left = 0;
    let right = nums.length - 1;
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2);
        if (nums[mid] - 1 < mid) {
            // 左半边都符合nums[index] == index, 换一种思路就是nums[index] - 1 < index
            left = mid + 1;
        } else {
            // 那么右半边符合的条件就是 nums[index] - 1 == index
            right = mid - 1;
        }
    }
    return right + 1;
};

2. 第 k 个缺失的正整数

在这里插入图片描述

  • 题目分析:按照实例1分析;如果没有缺失符合arr[index] = index+1;现在就和上一题进行联系,上一题其实可以理解为这题的特殊化,及缺失的第一个数(k = 1),在这里要找缺失的第k个数,及左边符合arr[index] - k < index + 1,右边符合arr[index] - k >= index + 1;如在实例1中,及目标值在7和11之间,所以找到符合条件最靠近目标值的边界,及找到7的index为3,那么缺失的值为3+5+1 = 9;
var findKthPositive = function(arr, k) {
    // 先判断特殊条件,如果数组的第一个值就大于k,那么缺失的的值相当在1到arr[0]之间,直接返回k
    if (arr[0] > k) {
        return k;
    }
    let left = 0;
    let right = arr.length - 1;
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2);
        // 在寻找目标值的左半边都符合arr[index] - k < index + 1
        if (arr[mid] - k - 1 < mid) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return right + k + 1;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值