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