⚡『LeetCode-Offer』一图看懂 LeetCode1539. 第 k 个缺失的正整数

2,973 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

📃 题目描述

题目链接:1539. 第 k 个缺失的正整数 - 力扣(LeetCode) (leetcode-cn.com)

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。

请你找到这个数组里第 k 个缺失的正整数。

示例 1:

 输入:arr = [2,3,4,7,11], k = 5
 输出:9
 解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,...] 。第 5 个缺失的正整数为 9 。

示例 2:

 输入:arr = [1,2,3,4], k = 2
 输出:6
 解释:缺失的正整数包括 [5,6,7,...] 。第 2 个缺失的正整数为 6 。

🔔 解题思路

首先明白题意,缺失的数一定是从 1 开始判断,而且题目中的数组已经严格升序了,那就好办了。

使用 cur 表示当前位置应该出现的数,如果数组中该位置上的数和 cur 不相等,说明 cur 缺失了,就将 k - 1,并且把 cur + 1,因为刚刚那个缺失的 cur 已经计算过了。接着,我们再来看数组中这个位置上的数是不是 cur + 1,如果还不是,那继续 k - 1,cur + 1;如果是,说明 cur + 1 出现了即没有缺失,那我们就判断数组的下一位是不是 cur + 2 ......

最后可能会有一种情况,那就是数组已经遍历完了但是 k 还没有减到 0,这就说明缺失的第 k 个数是超过数组的最后一个数的,这里我们需要做个特殊处理,其实就是 (数组的最后一个数 - 1) + 剩余的 k 值 就行了。

以 arr = [2,3,4,7,11],k = 5为例:

 class Solution {
     public int findKthPositive(int[] arr, int k) {
         // 当前位置应当出现的数
         int cur = 1;
 ​
         int i = 0;
         while (i < arr.length) {
             if (cur != arr[i]) {
                 // cur 缺失
                 k --;
                 if (k == 0) {
                     return cur;
                 }
                 cur ++;
             } else {
                 i ++;
                 cur ++;
             }
         }
 ​
         // 遍历完数组但是 k 还没有减完
         return (cur - 1) + k;
     }
 }

💥 复杂度分析

  • 空间复杂度:O(1)
  • 时间复杂度:O(N)

如果小伙伴们和我一样总是犯愁刷题没有顺序和体系,最终导致半途而废的话,可以看这里哦:LeetCode-Offer: LeetCode + 剑指 Offer = 💰,博主目前东南大学硕士在读,也在准备秋招,大伙儿可以来这里一起每天刷题打卡呀~

我的 公众号『 飞天小牛肉 』,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 技术栈等相关原创技术好文。关注公众号第一时间获取文章更新,后台回复 300 即可免费获取极客大学出品的 Java 面试 300 题,回复 Echo 免费领取 star 1k+ 社区项目的配套教程