第K个缺失的数
链接
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/kth-missing-positive-number/
题目
题解
二段性:分析题目排序数组寻找缺失的第k个数,我们针对某个元素来分析a[i],到a[i]位置时我们可以根据已排序的数组特性求出到i位置时缺失了几个数,因为元素都是从>=1开始的,如果没有缺失那么a[i]-1 - i = 0,如果存在缺失那么a[i] - i - 1应该就是到i位置时缺失的数的个数,根据每个位置缺失的数的个数我们可以将数组分为缺失个数小于k和大于等于k,我们只需要找到大于等于k的这段区间的左端点或者找到小于k区间的右端点,也就是找到k所介于的那个两个数值
找到这两个数,我们就可以确定缺失的第k个数了,此时我们假设左边的元素位x,右边为y,我们可以求出左边这个元素结尾时缺少多少个数x-l-1,然后只需要在x的基础上加上要求第k个缺失的数减去到左边位置缺失的数就求出第k个缺失的数
代码
class Solution {
// 左区间右端点
public int findKthPositive(int[] arr, int k) {
if (arr[0] > k) return k;
int l = 0, r = arr.length - 1;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if (arr[mid] - mid - 1 < k) l = mid;
else r = mid - 1;
}
return arr[l] + (k - (arr[l] - (l) - 1));
}
// 左区间右端点
public int findKthPositive(int[] arr, int k) {
if (arr[0] > k) return k;
int l = 0, r = arr.length;
while (l < r) {
int mid = l + (r - l) / 2;
if (arr[mid] - mid - 1>= k) r = mid;
else l = mid + 1;
}
return arr[l - 1] + (k - (arr[l - 1] - (l - 1) - 1));
}
}