Leetcode 1539.第k个缺失的正整数

304 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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]21
arr[1]31
arr[2]41
arr[3]73
arr[4]116

可以得到数组第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
};

执行情况

image.png

后记

这道题是二分法下的一道简单题,刚开始做的时候真的没有想到这道题还能用二分法去做,我这种方法时间复杂度不是很好,但是也是一种比较好理解的思路。