一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
题目描述
给你一个严格升序排列的正整数数组arr和一个整数k,找出这个数组里第k个缺失的正整数
思考
这里的严格升序确定了数组的格式,如果一个正整数也不缺少的话,数组是[1,2,3,4,5,6...]这种类型。根据给出的示例可以看出arr[0]为2,前面有1一个缺失的正整数;arr[1]为3,前面有1一个缺失的正整数;arr[3]为7,前面有1、5、6三个缺失的正整数。由此可以列出表格:
| 第i个元素 | arr[i]的值 | 前面缺失的正整数数量 |
|---|---|---|
| arr[0] | 2 | 1 |
| arr[1] | 3 | 1 |
| arr[2] | 4 | 1 |
| arr[3] | 7 | 3 |
| arr[4] | 11 | 6 |
可以得到数组第i个位置前面缺失的正整数数量为arr[i] - i - 1(因为数组下标从零开始)根据这个公式可以限制找到第k个缺失正整数之后的数组元素位置,arr[i] - i - 1 <= k。因为数组是严格升序排列的,所以只要加上缺失的数量,即i + k 就是最终的结果
考虑特殊情况
如果数组没有缺失正整数,那么数组第k个缺失的正整数就是数组最后一个元素再加上k,即为arr.length + k。
代码
var findKthPositive = function(arr, k) {
for(let i = 0 ; i < arr.length ; i++){
if(arr[i] - i - 1 >= k) {
return i + k
}
}
return arr.length + k
};
执行情况
后记
这道题是二分法下的一道简单题,刚开始做的时候真的没有想到这道题还能用二分法去做,我这种方法时间复杂度不是很好,但是也是一种比较好理解的思路。