标签:重复 for 空间 差值 length htm inpu iss else
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
有序数组中的缺失元素。题意是给一个有序的,没有重复元素的数组,请你找出其中第K个缺失的元素。
这道题有两种思路,一种线性,一种二分法。需要注意一个corner case,如果K大于数组的长度了,那么第K个缺失的元素是最后一个元素 + K。同时,missing number的个数 = nums[end] - nums[start] - (end - start)。举例,4和7之间缺失2个数字 = (7 - 4) - (1 - 0)。
A = [4,7,9,10], K = 3
首先是线性的做法。因为数组是有序的且递增的,所以每次只要计算一下每两个数字之间的差值 - 1就知道是否到K了。
一开始7 - 4 = 3,虽然两个数字的差值是3,但是实际缺失的数字只有2个,所以要减一。如果每两个数字之间的差值小于K,则需要将K减去两数字之间的差值之后,再带入下两个数字之间去比较。反之如果某两个数字之间的差值小于当前的K,那么第K个缺失的数字 = nums[i - 1] + K。
时间O(n)
空间O(1)
Java实现
1 class Solution { 2 public int missingElement(int[] nums, int k) { 3 for (int i = 1; i < nums.length; i++) { 4 if (nums[i] - nums[i - 1] - 1 >= k) { 5 return nums[i - 1] + k; 6 } 7 k -= nums[i] - nums[i - 1] - 1; 8 } 9 return nums[nums.length - 1] + k; 10 } 11 }
再来是二分法。以后看到input是有序的,就要想想能不能往二分法上靠,以减小时间复杂度。
因为缺失数字的个数公式 = nums[end] - nums[start] - (end - start),所以如果K > missing,也就是说如果数组中缺失的数字个数总和都小于K的话,结果是nums[end] + (k - missing)。如果是一般的情形,即缺失的数字夹在数组中间的话,那么我们就用二分法去找。这里的二分,看的是数组中间那个元素nums[mid]跟nums[start]元素之间有多少个缺失的元素,如果这个差值小于K,说明要找的数字在数组的右半边,start = mid;反之如果nums[mid]跟nums[start]之间缺失元素的个数大于K,则说明第K个缺失的数字在数组的左半边。
时间O(logn)
空间O(1)
Java实现
1 class Solution { 2 public int missingElement(int[] nums, int k) { 3 // corner case 4 if (nums == null || nums.length == 0) { 5 return 0; 6 } 7 8 // normal case 9 int start = 0; 10 int end = nums.length - 1; 11 int missing = nums[end] - nums[start] - (end - start); 12 if (missing < k) { 13 return nums[end] + (k - missing); 14 } 15 while (start + 1 < end) { 16 int mid = start + (end - start) / 2; 17 missing = nums[mid] - nums[start] - (mid - start); 18 if (k > missing) { 19 k -= missing; 20 start = mid; 21 } else { 22 end = mid; 23 } 24 } 25 return nums[start] + k; 26 } 27 }
[LeetCode] 1060. Missing Element in Sorted Array
标签:重复 for 空间 差值 length htm inpu iss else
原文地址:https://www.cnblogs.com/cnoodle/p/13193731.html