leetcode
leetcode 901 ~ 950
有序数组中的缺失元素

有序数组中的缺失元素

难度:

标签:

题目描述

代码结果

运行时间: 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`中的'空位数量'?具体的计算公式是什么?
函数`compute_blank`用于计算在有序数组中两个给定索引`l`和`r`之间的缺失元素数量。具体的计算公式是`nums[r] - nums[l] - (r - l)`。这个公式的意思是:从`nums[l]`到`nums[r]`之间理论上应该有`nums[r] - nums[l] + 1`个整数(包括`nums[l]`和`nums[r]`),但数组中实际上只有`r - l + 1`个元素,因此缺失的元素数量就是`nums[r] - nums[l] - (r - l)`。
🦆
在二分搜索中,为什么在`while`循环的条件是`l < r - 1`而不是通常的`l <= r`?这样的条件对结果有何影响?
在这个二分搜索算法中,使用`l < r - 1`是为了避免在更新左右界时造成无限循环。当`l`和`r`相邻时,即`l + 1 == r`,如果使用`l <= r`作为循环条件,可能导致`mid`一直等于`l`,从而使得`l`或`r`的更新停滞不前。设置`l < r - 1`确保了循环能够在两指针相邻时退出,这时候下一个缺失的元素一定位于`nums[l]`和`nums[r]`之间。
🦆
在更新`k`的值时,为什么要从`k`中减去`n_lost_left`?这样的操作反映了哪些算法逻辑?
在二分搜索过程中,如果发现左边子数组中的缺失元素数量`n_lost_left`小于或等于`k`,表明所求的第`k`个缺失元素不在左边子数组中。因此,需要将搜索范围缩小到右边子数组,并且更新`k`的值为`k - n_lost_left`,即减去左边已经计算过的缺失元素数量。这样的操作确保了`k`始终表示在当前考虑的数组片段中所要找的缺失元素的序号。
🦆
如果`k`大于数组中所有缺失的元素数量,为什么直接返回`nums[-1] + k - n_lost`?返回这个值的依据是什么?
如果`k`大于数组中所有缺失的元素数量`n_lost`,这意味着即使将数组中现有的所有缺失元素全部计算完,仍然不能满足找到第`k`个缺失元素的要求。因此,需要在数组的最后一个元素`nums[-1]`之后继续寻找缺失的元素。`nums[-1] + k - n_lost`的计算基于这样的逻辑:从数组最后一个元素`nums[-1]`起,再向上增加`k - n_lost`个单位,即可达到第`k`个缺失元素的值。

相关问题