有序数组中的缺失元素
难度:
标签:
题目描述
代码结果
运行时间: 25 ms, 内存: 20.8 MB
/*
* Problem: Missing Element in Sorted Array (Leetcode 1060)
* This approach uses Java Streams to find the kth missing element.
*
* Approach:
* 1. We first create a stream of all possible numbers from the minimum to the maximum in the given array.
* 2. Filter out numbers that are present in the array, leaving only the missing ones.
* 3. Collect the missing numbers and find the k-th missing number.
*/
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public int missingElement(int[] nums, int k) {
Set<Integer> numSet = Arrays.stream(nums).boxed().collect(Collectors.toSet());
return IntStream.range(nums[0], nums[nums.length - 1] + k + 1)
.filter(i -> !numSet.contains(i))
.skip(k - 1)
.findFirst()
.getAsInt();
}
}
解释
方法:
此题解利用二分搜索的方法来寻找有序数组中的缺失元素。首先定义一个函数 `compute_blank`,用于计算给定两个索引之间的空位数量。然后检查若给定的 k 大于数组中总的缺失数,则直接在数组的最后一个数后面加上相应的数量。如果不是,则使用二分搜索,通过不断调整左右边界,缩小可能存在缺失元素的范围,直到找到确切的缺失元素位置。
时间复杂度:
O(log n)
空间复杂度:
O(1)
代码细节讲解
🦆
如何定义和计算函数`compute_blank`中的'空位数量'?具体的计算公式是什么?
▷🦆
在二分搜索中,为什么在`while`循环的条件是`l < r - 1`而不是通常的`l <= r`?这样的条件对结果有何影响?
▷🦆
在更新`k`的值时,为什么要从`k`中减去`n_lost_left`?这样的操作反映了哪些算法逻辑?
▷🦆
如果`k`大于数组中所有缺失的元素数量,为什么直接返回`nums[-1] + k - n_lost`?返回这个值的依据是什么?
▷