Given an integer array nums which is sorted in ascending order and all of its elements are unique and given also an integer k, return the kth
missing number starting from the leftmost number of the array.
The missing numbers between elements can be counted by comparing the actual value and the expected value at each index. Binary search helps us quickly locate where the kth missing number falls, making the solution efficient for large arrays and large k.
classSolution {
public:int missingElement(vector<int>& nums, int k) {
int n = nums.size();
auto missing = [&](int i) { return nums[i] - nums[0] - i; };
if (k > missing(n-1)) return nums[n-1] + k - missing(n-1);
int left =0, right = n-1;
while (left < right) {
int mid = left + (right - left) /2;
if (missing(mid) < k) left = mid +1;
else right = mid;
}
return nums[left-1] + k - missing(left-1);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
funcMissingElement(nums []int, kint) int {
n:= len(nums)
missing:=func(iint) int { returnnums[i] -nums[0] -i }
ifk > missing(n-1) {
returnnums[n-1] +k-missing(n-1)
}
left, right:=0, n-1forleft < right {
mid:=left+ (right-left)/2ifmissing(mid) < k {
left = mid+1 } else {
right = mid }
}
returnnums[left-1] +k-missing(left-1)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution {
publicintmissingElement(int[] nums, int k) {
int n = nums.length;
int missing = nums[n-1]- nums[0]- (n-1);
if (k > missing) return nums[n-1]+ k - missing;
int left = 0, right = n-1;
while (left < right) {
int mid = left + (right - left) / 2;
int miss = nums[mid]- nums[0]- mid;
if (miss < k) left = mid + 1;
else right = mid;
}
return nums[left-1]+ k - (nums[left-1]- nums[0]- (left-1));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
funmissingElement(nums: IntArray, k: Int): Int {
val n = nums.size
funmissing(i: Int) = nums[i] - nums[0] - i
if (k > missing(n-1)) return nums[n-1] + k - missing(n-1)
var left = 0var right = n-1while (left < right) {
val mid = left + (right - left) / 2if (missing(mid) < k) left = mid + 1else right = mid
}
return nums[left-1] + k - missing(left-1)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from typing import List
classSolution:
defmissingElement(self, nums: List[int], k: int) -> int:
n = len(nums)
defmissing(i: int) -> int:
return nums[i] - nums[0] - i
if k > missing(n-1):
return nums[-1] + k - missing(n-1)
left, right =0, n-1while left < right:
mid = left + (right - left) //2if missing(mid) < k:
left = mid +1else:
right = mid
return nums[left-1] + k - missing(left-1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
impl Solution {
pubfnmissing_element(nums: Vec<i32>, k: i32) -> i32 {
let n = nums.len();
let missing =|i: usize| nums[i] - nums[0] - i asi32;
if k > missing(n-1) {
return nums[n-1] + k - missing(n-1);
}
let (mut left, mut right) = (0, n-1);
while left < right {
let mid = left + (right - left) /2;
if missing(mid) < k {
left = mid +1;
} else {
right = mid;
}
}
nums[left-1] + k - missing(left-1)
}
}