【二分查找】1539. 第 k 个缺失的正整数
问题描述
给定一个严格升序排列的正整数数组 arr 和一个整数 k。请你找到这个数组里第 k 个缺失的正整数。
示例
输入:arr = [2,3,4,7,11], k = 5
输出:9
解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。
解题思路
这道题目可以使用二分查找算法来解决。二分查找算法的核心思想是每次将搜索区间减半,从而在有限的时间内找到目标值。
-
初始化搜索区间的左右边界
l和r。其中,l初始化为-1,r初始化为数组长度arr.size()。 -
当
r - l > 1时,进行二分查找:
a. 计算中间位置 mid。
b. 判断 arr[mid] - mid - 1 与 k 的关系:
-
如果 `arr[mid] - mid - 1 >= k`,说明第 `k` 个缺失的正整数在 `mid` 的左侧,更新 `r` 为 `mid`。 -
如果 `arr[mid] - mid - 1 < k`,说明第 `k` 个缺失的正整数在 `mid` 的右侧,更新 `l` 为 `mid`。
-
当二分查找结束时,
r即为第k个缺失的正整数在数组中的位置。 -
返回
r + k作为答案。
代码实现
下面是一个使用二分查找算法解决问题的 C++ 代码实现:
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
int l=-1,r=arr.size();
int mid;
while(r-l>1)
{
mid=(r+l)>>1;
if(arr[mid]-mid-1>=k)
{
r=mid;
}
else
{
l=mid;
}
}
return r+k;
}
};
总结
这道题目使用二分查找算法在 O(log n) 的时间复杂度内解决了问题。二分查找算法的关键在于每次将搜索区间减半,从而在有限的时间内找到目标值。在本题中,我们利用二分查找算法在严格升序排列的正整数数组中寻找第 k 个缺失的正整数。
本文由mdnice多平台发布