class Solution:
def findKthPositive(self, arr: List[int], k: int) -> int:
"""
some restrains:
1. sorted(strickly increasing) array, ideally always start with 1
2.
"""
# time O(N) space O(1)
n = len(arr)
if arr[0] != 1:
if k -(arr[0]-1) <= 0:
return k
else:
k = k - (arr[0]-1)
for r in range(1,n):
if arr[r]-arr[r-1] > 1:
diff = arr[r]-arr[r-1]-1
if k-diff <= 0 :
return arr[r-1]+k
else:
k -= diff
return arr[-1] + k
Binary Search solution
"""
assuming first m elements are not missing. for (m+1) th, the number of missing elements are A[m] - m - 1
we need to find a point where kth number is between (A[m],A[m+1]]
"""
# time O(lgN) space O(1)
class Solution:
def findKthPositive(self, A: List[int], k: int) -> int:
l,r = 0, len(A)
while l < r:
mid = l + (r-l)//2
# print(f'l is {l}, r is {r}, mid is {mid}, m val is {A[mid]}')
if A[mid] - mid -1 < k :
l = mid + 1
elif A[mid] - mid -1 == k:
r = mid
#return mid-1+k
elif A[mid] - mid -1 > k:
r = mid
return l+k
some test cases for handleing changes when A[m]-m-1 == k : [1,5,6,7,12,14,17,32,35,43,55,60,64,65,67,75,79,80,82,90,92,93,95,99,102,103,109,110,111,112,113,114,129,132,134,139,141,146,147,152,162,163,164,172,183,200,202,206,216,217,219,222,223,231,232,241,246,260,261,262,276,278,285,294,302,303,305,306,312,323,325,331,332,333,337,341,344,345,352,353,361,369,378,383,396,403,406,408,409,415,418,419,422,427,433,437,438,441,444,447,448,456,460,461,464,471,476,480,482,483,485,487,490,491,493,497,499,506,507,509,511,513,518,522,528,530,531,532,535,536,539,543,548,551,552,553,556,563,567,572,578,579,586,587,588,589,590,594,607,611,613,617,619,627,629,632,636,638,650,654,659,667,669,672,673,675,676,682,685,693,705,710,714,717,724,727,728,729,732,740,743,752,763,766,771,772,777,784,787,793,799,800,804,805,811,822,826,838,840,848,850,851,857,859,863,864,865,868,872,873,880,883,887,891,893,895,902,906,908,909,915,918,922,926,931,933,948,953,959,962,965,967,972,973,976,983,984,985,986,989,993] 71 output 92 expect 91
[2] 1
[1,3] 1
[8,11,16,20,29,30,32,33,37,39,42,44,46,47,48,50,52,56,60,63,64,65,68,70,72,74,80] 45