【二分查找】1539. 第 k 个缺失的正整数

前言

作者: 迷茫的启明星

学习路线
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 。

解题思路

这道题目可以使用二分查找算法来解决。二分查找算法的核心思想是每次将搜索区间减半,从而在有限的时间内找到目标值。

  1. 初始化搜索区间的左右边界 lr。其中,l 初始化为 -1r 初始化为数组长度 arr.size()

  2. r - l > 1 时,进行二分查找:

a. 计算中间位置 mid

b. 判断 arr[mid] - mid - 1k 的关系:

  •   如果 `arr[mid] - mid - 1 >= k`,说明第 `k` 个缺失的正整数在 `mid` 的左侧,更新 `r` 为 `mid`。
    
  •   如果 `arr[mid] - mid - 1 < k`,说明第 `k` 个缺失的正整数在 `mid` 的右侧,更新 `l` 为 `mid`。
    
  1. 当二分查找结束时,r 即为第 k 个缺失的正整数在数组中的位置。

  2. 返回 r + k 作为答案。

代码实现

下面是一个使用二分查找算法解决问题的 C++ 代码实现:

class Solution {
public:
    int findKthPositive(vector& 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 个缺失的正整数。

你可能感兴趣的:(#,leetcode刷题,算法,leetcode,c++,青少年编程,二分查找)