给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。
如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。
1 | 示例 1: |
提示:
$1 <= nums.length <= 10^5$
$1 <= nums[i] <= 10^4$
$1 <= x <= 10^9$
前缀和+哈希表
- 分别计算从前往后和从后往前的前缀和
- 使用哈希表保存前缀和的值与index(用来降低时间复杂度)
- 因为每次都从数组的第一个和最后一个元素取,并且取完后删除那个元素,所以说每次取都是连续的从前往后取或者是连续的从后往前取,也就是从前往后的前缀和和从后往前的前缀和,因此使用前缀和可以降低时间复杂度。
- 为了求最小值,要使用两层循环分别计算从前往后的前缀和
prefix[i]
与从后往前的前缀和suffix[j]
的和,判断其是否等于x
,如果等于x
,那么更新i+j
的最小值。但是这样计算出现了超时,为了降低时间复杂度,因为 $1 <= nums[i] <= 10^4$ ,所以前缀和是递增的,不会有重复值,我们可以使用哈希表来去掉一层循环,哈希表的键为前缀和,哈希表的值为index
,当map.containsKey(x-prefix[i])
时,即满足条件更新min=Math.min(i+map.get(x-prefix[i]),min)
1 | class Solution { |
时间复杂度$O(n)$,空间复杂度$O(n)$