原题链接:1539. 第 k 个缺失的正整数
solution:
暴力做法://统计比数组元素小的个数,满足条件则返回,加一个特判缺失的数大于数组最大值
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
int n = arr.size();
int cnt = 0;
for(int i = 0, j = 1;i < n; i++){
while(arr[i] > j){
cnt++;
if(cnt == k)
return j;
j++;
}
j++;
}
return arr[n-1] + k - cnt;
}
};
二分:
①由于是严格有序,若所有数字都连续存在,则数字与其所在数组索引之差为1;否则差大于1,且前面若缺少k个数,则差为k+1。
②有了这个发现可使用二分查找找到缺失值大于k的位置,要求的缺失数在前面。
class Solution {
public:
int findKthPositive(vector<int>& arr, int k) {
int n = arr.size();
int l = 0,r = n;
while(l < r){
int mid = l + (r - l)/2;
if(arr[mid] - mid - 1>= k) r=mid;
else l = mid + 1;
}
return k+l;
}
};
######为什么返回k+l?
因为l所在的位置式第一个满足缺失个数大于等于k的位置,所以实际缺失的第k个数肯定值a[l-1]~a[l]之间,因此我们要求出a[l]这个数到底比第k个缺失值大多少。
利用公式a[l] - (a[l] - l - k)= k + l;