给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。
请你找到这个数组里第 k 个缺失的正整数。
示例 1:
输入:arr = [2,3,4,7,11], k = 5
输出:9
解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。
这道题依然是一个升序数组,但是不是连续的,中间有断层,但是下标+1表示应当前位置储存的数据。根据这个规律我们可以得到一个结论,arr[下标]-下标-1表示前面缺失的数的个数。到此,我们就可以采用二分了,直接上代码。
public int findKthPositive(int[] arr, int k) {
int left=0;//左边界
int right=arr.length-1;//右边界
if(arr[0]>k){//当数组第一位都大于缺失的数量时,说明缺失的数量就是数本身直接返回k
return k;
}
while(left<right){
int mid=(left+right)>>1;//位运算向右移一位相当于除以2
if((arr[mid]-mid-1)>=k){//当前下标下缺失的数大于目标缺失的数时,右边都比目标缺失数大
right=mid;
}else{
left=mid+1;//与上面相反
}
}
if((arr[right]-right-1-k)>=0){//由于每次循环结束 当表达式大于等于0时说明缺失数比当前数小或相等
return right+k;//right+k 等价于 arr[right]-(arr[right]-right-1-k+1)
}else{
return right+k+1;//等价于arr[right]-(arr[right]-right-1-k)
}
}