1539. 第 k 个缺失的正整数
大约 2 分钟
---
1539. 第 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:模拟
1. 核心思想
从 开始递增枚举正整数,用指针 遍历数组。如果当前整数等于 ,则 后移。否则当前整数缺失, 减 。当 时返回当前整数。
2. 具体步骤
第 1 步:,。
第 2 步:循环直到 :
- 如果 且 :。
- 否则:,如果 返回 。
- 。
3. 举例说明
以 为例:
- :缺失(),。
- :匹配 ,。
- :匹配 ,。
- :匹配 ,。
- :缺失,。
- :缺失,。
- :匹配 ,。
- :缺失,。
- :缺失,,返回 。
思路 1:代码
class Solution:
def findKthPositive(self, arr: List[int], k: int) -> int:
i, cur = 0, 1
while k > 0:
if i < len(arr) and arr[i] == cur:
i += 1
else:
k -= 1
if k == 0:
return cur
cur += 1
return -1思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。
思路 2:二分查找(进阶)
1. 核心思想
之前缺失的正整数个数为 (因为前 个数中,理想情况下连续正整数为 ,实际为 ,缺失数 = )。
用二分查找找到第一个缺失数 的位置。
2. 具体步骤
二分查找最小的 使得 。
最终缺失的第 个数 = 。
class Solution:
def findKthPositive(self, arr: List[int], k: int) -> int:
l, r = 0, len(arr)
while l < r:
mid = (l + r) // 2
if arr[mid] - mid - 1 >= k:
r = mid
else:
l = mid + 1
return l + k思路 2:复杂度分析
- 时间复杂度:。
- 空间复杂度:。