Problem
Given an array arr of positive integers sorted in a strictly increasing order, and an integer k.
Find the kth positive integer that is missing from this array.
Example 1:
1 | Input: arr = [2,3,4,7,11], k = 5 |
Example 2:
1 | Input: arr = [1,2,3,4], k = 2 |
Constraints:
1 <= arr.length <= 10001 <= arr[i] <= 10001 <= k <= 1000arr[i] < arr[j]for1 <= i < j <= arr.length
Analysis
这道题目给出一个数组和一个数K,要求找出缺失的第K个数字。首先题目给出的数组是严格递增的,我们可以很好地利用这个特性。我们先来看数字和下标的关系,正常情况下,如果没有缺失的话,应该是有arr[i] = i + 1。所以如果我们要找出缺失的数字,就要先计算出值和下标的差距。以Example1为例,我们计算出每个数字和下标的差[1, 1, 1, 3, 6]。当值为7的时候,差是3,即缺失的数字的长度是3,是[1,5,6];当值是11时,差是6,即缺失的数字的长度是6,是[1,5,6,8,9,10],这个时候就超过了K。到这一步,我们知道如何找到在哪个位置缺失超过了K个数字。
知道了缺失了超过K个数字,我们就要精确定位到缺失的第K个数字是什么。这个其实非常简单,用该数字的下标加上K即可。
Solution
如何找到在哪个位置缺失超过了K 个数字可以用线性的方法,复杂度就是O(n),但其实这里本质上是对diff去做搜索,所以可以用二分,把复杂度进一步降到O(logn)。
Code
1 | class Solution { |
Summary
这道题目看上去比较简单,但实际上解决起来还是比较巧妙,借助了下标的方法去判断。同时使用二分法去降低计算复杂度,所以这道题是非常适合作为面试题的。这道题这道题目的分享到这里,谢谢您的支持!