码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 1060. Missing Element in Sorted Array

时间:2020-06-26 10:52:26      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:重复   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. 1 <= A.length <= 50000
  2. 1 <= A[i] <= 1e7
  3. 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 题目总结

[LeetCode] 1060. Missing Element in Sorted Array

标签:重复   for   空间   差值   length   htm   inpu   iss   else   

原文地址:https://www.cnblogs.com/cnoodle/p/13193731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!