Given an array arr of positive integers sorted in a strictly increasing order, and an integer k.
Find the kth positive integer that is missing from this array.
Example 1:
Input: arr = [2,3,4,7,11], k = 5 Output: 9 Explanation: The missing positive integers are [1,5,6,8,9,10,12,13,...]. The 5th missing positive integer is 9.
Example 2:
Input: arr = [1,2,3,4], k = 2 Output: 6 Explanation: The missing positive integers are [5,6,7,...]. The 2nd missing positive integer is 6.
Constraints:
1 <= arr.length <= 10001 <= arr[i] <= 10001 <= k <= 1000arr[i] < arr[j]for1 <= i < j <= arr.length
Related Topics:
Array, Hash Table
// OJ: https://leetcode.com/problems/kth-missing-positive-number/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
int findKthPositive(vector<int>& A, int k) {
for (int i = 1, j = 0; i <= 2000; ++i) {
if (j < A.size() && A[j] == i) ++j;
else if (--k == 0) return i;
}
return -1;
}
};Or
// OJ: https://leetcode.com/problems/kth-missing-positive-number/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
int findKthPositive(vector<int>& A, int k) {
for (int i = 1, j = 0; i <= 1000; ++i) {
if (j < A.size() && A[j] == i) ++j;
else if (--k == 0) return i;
}
return 1000 + k;
}
};For the first i + 1 numbers in A, the count of missing numbers in these i + 1 numbers is miss(i) = A[i] - i - 1.
Example:
A=[1,4,5,8]
i=2
miss(2) = A[2] - 2 - 1 = 2 // There are two missing numbers in [1,4,5].
We can binary search the greatest index i which satisfies miss(i) < k. Assume it's x, then x + k + 1 is the answer. It's because adding x + 1(the count of existing numbers) to k (the index of the target missing number) will get the answer (the value of the target missing number).
Example,
A=[1,4,5,8]
k=4
For i = 2, miss(2) = 2 < k
For i = 3, miss(3) = 4 >= k
So x = 2
The answer is x + k + 1 = 7
The range of the index to search is [0, N - 1]. When miss(M) < k, L = M + 1; otherwise, R = M - 1.
Then in the end, R will be the x, i.e. the greatest index that miss(R) < k. So the answer is R + k + 1, or L + k.
// OJ: https://leetcode.com/problems/kth-missing-positive-number/
// Author: github.com/lzl124631x
// Time: O(logN)
// Space: O(1)
class Solution {
public:
int findKthPositive(vector<int>& A, int k) {
int L = 0, R = A.size() - 1;
while (L <= R) {
int M = (L + R) / 2;
if (A[M] - M - 1 < k) L = M + 1;
else R = M - 1;
}
return L + k;
}
};