一、题目
1、题目描述
给你一个 严格升序排列 的正整数数组 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 。
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/kth-missing-positive-number/
二、解题报告
1、思路分析
(
1
)
(1)
(1)arr[i] - i - 1的值代表前面缺失了多少个数。比如示例1中arr[4] - 4 - 1 = 11 - 4 -1 = 6。代表11前面缺失了6个数。
(
2
)
(2)
(2)考虑普遍情况,当缺失的数在数组中最大最小元素代表的区间范围内时,我们只要找到arr[i] - i - 1 >= k > arr[i-1] - i -1 -1的位置i,缺失的数肯定位于arr[i-1]和arr[i]之间。
(
3
)
(3)
(3)缺失的数为arr[i] - (arr[i] - i - 1 - k + 1) = i+k
(
4
)
(4)
(4)对于边界条件,我们提前判断,当arr[0] > k时,说明缺失的第k个数在数组左边外侧,直接返回k。当arr[arr.length-1] < k时,说明缺失的第k个数在数组右边外侧,直接返回k + arr.length
2、时间复杂度
时间复杂度为O(logn)
3、代码详解
class Solution {
public int findKthPositive(int[] arr, int k) {
if (arr[0] > k) {
return k;
}
if (arr[arr.length - 1] - arr.length < k) {
return k + arr.length;
}
int l = 0;
int r = arr.length - 1;
while(l < r) {
int mid = l + (r - l) / 2;
if (arr[mid] - mid - 1 < k) {
l = mid + 1;
} else {
r = mid;
}
}
return r + k;
}
}