# 1658. Minimum Operations to Reduce X to Zero ###### tags: `Leetcode` `Medium` `Prefix Sum` `HashMap` Link: https://leetcode.com/problems/minimum-operations-to-reduce-x-to-zero/ ## 思路 ### 思路一 HashMap+PrefixSum $O(N)$ $O(N)$ (2sum 变式) 先从头到尾 用map记录所有prefixsum以及包含它及它的前面有几个item 再从尾到头 算postsum 然后看map里面有没有x-postsum 要注意要保证两次取的item的个数和小于nums.length ### 思路二 Sliding Window $O(N)$ $O(1)$ 找到和为totalsum-x的subarray ## Code ### 思路一 HashMap+PrefixSum $O(N)$ $O(N)$ ```java= class Solution { public int minOperations(int[] nums, int x) { Map<Integer, Integer> frontMap = new HashMap<>(); frontMap.put(0,0); int sum = 0; int ans = Integer.MAX_VALUE; for(int i=0; i<nums.length; i++){ sum += nums[i]; frontMap.put(sum, i+1); } sum = 0; for(int i=nums.length; i>=0; i--){ if(i!=nums.length) sum += nums[i]; if(frontMap.containsKey(x-sum) && frontMap.get(x-sum)+nums.length-i<=nums.length){ ans = Math.min(ans, frontMap.get(x-sum)+nums.length-i); } } return ans==Integer.MAX_VALUE?-1:ans; } } ``` ### 思路二 Sliding Window $O(N)$ $O(1)$ java ```java= public class Solution { public int MinOperations(int[] nums, int x) { int sum = 0; for(int num:nums){ sum += num; } sum -= x; if(sum < 0) return -1; if(sum == 0) return nums.length; int start = 0, cur = 0, len = -1; for(int end = 0; end < nums.length; end++) { if (cur < sum) cur += nums[end]; while (cur >= sum) { if (cur == sum) len = Math.Max(len, end - start + 1); cur -= nums[start++]; } } return len == -1 ? -1 : nums.length - len; } } ``` c++ ```cpp= class Solution { public: int minOperations(vector<int>& nums, int x) { int sum = 0; for(int num:nums) sum += num; if(sum==x) return nums.size(); for(int i=1; i<nums.size(); i++){ nums[i] += nums[i-1]; } map<int, int> map; map[0] = -1; int maxLen = 0; for(int i=0; i<nums.size(); i++){ if(map.find(nums[i]-(sum-x))!=map.end()){ maxLen = max(maxLen, i-map[nums[i]-sum+x]); } if(map.find(nums[i])==map.end()) map[nums[i]] = i; } if(maxLen==0) return -1; return nums.size()-maxLen; } }; ```