联想 “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;
};