1539. 第 k 个缺失的正整数

1539. 第 k 个缺失的正整数

    • 题目
    • 链接
    • 代码

题目

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。

请你找到这个数组里第 k 个缺失的正整数。

示例 1:

输入:arr = [2,3,4,7,11], k = 5
输出:9
解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,…] 。第 5 个缺失的正整数为 9 。
示例 2:

输入:arr = [1,2,3,4], k = 2
输出:6
解释:缺失的正整数包括 [5,6,7,…] 。第 2 个缺失的正整数为 6 。

提示:

1 <= arr.length <= 1000
1 <= arr[i] <= 1000
1 <= k <= 1000
对于所有 1 <= i < j <= arr.length 的 i 和 j 满足 arr[i] < arr[j]

进阶:

你可以设计一个时间复杂度小于 O(n) 的算法解决此问题吗?

链接

1539. 第 k 个缺失的正整数

代码

class Solution {
public:
    int findKthPositive(vector<int>& arr, int k) {
        if(arr[0] > k) return k;//特判,如果arr[0]就大于了指定的缺失个数,那么arr[0]前面的数字都是缺失的,直接返回k
        int last = arr[arr.size()-1];//数组中最后一个数
        if(last < k) return last + k-(last - arr.size());//如果指定缺失个数>数组里最大的数字,那么数组中实际缺失的个数可以直接算出来等于last-arr.size(),剩余缺失个数为k-(last-arr.size()),只需要在last的基础上+剩余缺失个数就算结果
        // 二分,对数组进行二分,从右往左查找,查找第一个arr[mid]满足实际缺失个数小于指定的缺失个数k
        int l = 0, r = arr.size()-1;
        while(l < r){
            int mid = l + (r-l+1>>1);
            if(arr[mid]-(mid+1) >= k) r = mid-1;
            else l = mid;
        }
        // 在边界值的基础上+剩余缺失个数
        return arr[l]+(k-(arr[l] - (l+1)));
    }
};

你可能感兴趣的:(#,LeetCode,数据结构,算法,排序算法)