[LeetCode] 1060. Missing Element in Sorted Array

Posted CNoodle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1060. Missing Element in Sorted Array相关的知识,希望对你有一定的参考价值。

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. 1 <= A.length <= 50000
  2. 1 <= A[i] <= 1e7
  3. 1 <= K <= 1e8

有序数组中的缺失元素。

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。请你找到这个数组里第 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 }

 

相关题目

410. Split Array Largest Sum

774. Minimize Max Distance to Gas Station

875. Koko Eating Bananas

1011. Capacity To Ship Packages In N Days

1060. Missing Element in Sorted Array

1231. Divide Chocolate

1283. Find the Smallest Divisor Given a Threshold

1482. Minimum Number of Days to Make m Bouquets

1539. Kth Missing Positive Number

LeetCode 题目总结

以上是关于[LeetCode] 1060. Missing Element in Sorted Array的主要内容,如果未能解决你的问题,请参考以下文章

1060. Missing Element in Sorted Array

LeetCode Missing Ranges

leetcode笔记:Missing Number

Leetcode 41. First Missing Positive

[LeetCode] Missing Ranges 缺失区间

LeetCode题解-----First Missing Positive