Given an integer array nums and an integer k, return the length of the shortest non-empty subarray of nums with a sum of at least k. If there is no such subarray, return -1.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [1], k = 1
Output: 1
Example 2:
Input: nums = [1,2], k = 4
Output: -1
Example 3:
Input: nums = [2,-1,2], k = 3
Output: 3
Constraints:
- 1 <= nums.length <= 105
- -105 <= nums[i] <= 105
- 1 <= k <= 109
计算出 prefix sum, 然后将 prefix sum 放到一个 min heap 中, 假设我们要找以 nums[i]为结尾的最短的 subarray, 其实就是找 prefix_sum[i] - prefix_sum[x] >= k, x < i, x 取尽可能大的值, 实际的 subarray 的长度就是 i - x, 假设我们已经找到了 ans[i], 即以 nums[i]为结尾的最小的 subarray 的长度,
如果 j > i, prefix_sum[j] < prefix_sum[i], 那我们无需再检查 j, 因为符合条件的 prefix_sum[x]在检查 prefix_sum[i]的时候一定已经检查过了, 无论 x 值为多少, 因为 j > i, 所以 j - x > i - x, 又因为 ans[i]为所有的 i - x 的最小值, 所以现在 j - x 一定不会小于 ans[i]。如果 prefix_sum[j] > prefix_sum[i]那我们只需要机继续在 min heap 中剩余的 prefix sum 中继续做检查即可
use std::cmp::Reverse;
use std::collections

这篇博客介绍了如何解决LeetCode的862题,即寻找数组中和至少为k的最短子数组。通过计算前缀和,并利用最小堆来查找满足条件的子数组,当前缀和大于等于k时,更新最短子数组的长度。文章给出了具体的例子和算法思路,解释了为何可以跳过某些不必要的检查,以提高效率。

785

被折叠的 条评论
为什么被折叠?



