网站代运营性价比高网站seo诊断报告怎么写
题目链接
第 k 个缺失的正整数
题目描述
注意点
- 1 <= arr.length <= 1000
- 1 <= arr[i] <= 1000
- 1 <= k <= 1000
- 找到这个数组里第 k 个缺失的正整数
- arr 严格升序
解答思路
- 初始想到的是从1开始遍历正整数,记录到达某个正整数时数组中缺失的正整数数量lack,当lack = k时返回当前的正整数即可
- 参照题解使用二分查找,在数组中任意一个位置i其缺失的正整数数量为arr[i] - i - 1,初始l = 0,r = arr.length - 1,每次计算l和r的中间位置mid缺失的正整数数量lack,如果lack >= k,说明第k个缺失的正整数在mid左侧,r = mid - 1;如果lack < k,说明第k个缺失的正整数在mid右侧,l = mid + 1,最终第 k 个缺失的正整数就等于k + r + 1
代码
class Solution {public int findKthPositive(int[] arr, int k) {int n = arr.length;int l = 0;int r = n - 1;while (l <= r) {int mid = l + ((r - l) >> 1);int lack = arr[mid] - mid - 1;if (lack >= k) {r = mid - 1;} else {l = mid + 1;}}return k + r + 1;}
}
关键点
- 二分查找的思想
- 第i个位置缺失的正整数数量是非严格递增的
- 注意最终结果res = k + r + 1是由arr[r] + k - lack推出的,其中lack是r位置缺失的正整数数量,lack = arr[r] - r - 1