Given a sorted array A
of unique numbers, find the K-th
missing number starting from the leftmost number of the array.
Example 1:
Input: A = [4,7,9,10], K = 1 Output: 5 Explanation: The first missing number is 5.
Example 2:
Input: A = [4,7,9,10], K = 3 Output: 8 Explanation: The missing numbers are [5,6,8,...], hence the third missing number is 8.
Example 3:
Input: A = [1,2,4], K = 3 Output: 6 Explanation: The missing numbers are [3,5,6,7,...], hence the third missing number is 6.
Note:
1 <= A.length <= 50000
1 <= A[i] <= 1e7
1 <= K <= 1e8
-----------------------------------------
二分的题目反应还是有些慢,需要快速明确几点:
1. 从位置x到某个目标函数f(x)的单调性
2. 这个x在单调性曲线上的位置
3. f(x)和最终答案的关系
不清楚的地方找几个例子快速搞清楚,拿这题来说,关于上面三个问题:
1. f(x)用来表示位置x用掉了几个miss的机会,那么f(x)=nums[x]-nums[0]-x
2. 拿几个例子可以知道,f(x)刚好是最后一个小于k的位置,也就是第一个>=的位置-1,按照二分的套路写法,就是l-1
3. 最终的结果就是nums[x]+k-f(x)=k+nums[0]+x,其中x是l-1
搞清楚了这些,代码就很容易了:
class Solution:
def missingElement(self, nums, k):
l,r = 0,len(nums)-1
while (l <= r):
mid = l + ((r-l)>>1)
target = nums[mid]-nums[0]-mid #target表示用掉了几个miss的机会
if (target >= k):
r = mid-1
else:
l = mid+1
return k+nums[0]+l-1