📍前言
🕺作者: 迷茫的启明星
学习路线
C语言从0到1
C++初阶
数据结构从0到1
😘欢迎关注:👍点赞🙌收藏✍️留言
🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!
持续更新中~
【二分查找】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 个缺失的正整数。