LeetCode 1658. Minimum Operations to Reduce X to Zero
原题链接在这里:https://leetcode.com/problems/minimum-operations-to-reduce-x-to-zero/
题目:
You are given an integer array nums
and an integer x
. In one operation, you can either remove the leftmost or the rightmost element from the array nums
and subtract its value from x
. Note that this modifies the array for future operations.
Return the minimum number of operations to reduce x
to exactly 0
if it is possible, otherwise, return -1
.
Example 1:
Input: nums = [1,1,4,2,3], x = 5 Output: 2 Explanation: The optimal solution is to remove the last two elements to reduce x to zero.
Example 2:
Input: nums = [5,6,7,8,9], x = 4 Output: -1
Example 3:
Input: nums = [3,2,20,1,1,3], x = 10 Output: 5 Explanation: The optimal solution is to remove the last three elements and the first two elements (5 operations in total) to reduce x to zero.
Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 104
1 <= x <= 109
题解:
After minimum operation to substract x, the remaining subarray with remaining sum = totalSum - x.
Thus this question is the same as maximum size subarray sum equals to totalSum - x.
Return nums.length - maxSize.
Note: when totalSum - x = 0. Return nums.length. Since we can't find subarray sum = 0. But the correct answer is to remove all the elements.
Time Complexity: O(n). n = nums.length.
Space: O(n).
AC Java:
1 class Solution { 2 public int minOperations(int[] nums, int x) { 3 int target = 0 - x; 4 for(int num : nums){ 5 target += num; 6 } 7 8 if(target == 0){ 9 return nums.length; 10 } 11 12 int sum = 0; 13 HashMap<Integer, Integer> sumToInd = new HashMap<>(); 14 sumToInd.put(0, -1); 15 int subArrLen = -1; 16 for(int i = 0; i < nums.length; i++){ 17 sum += nums[i]; 18 if(sumToInd.containsKey(sum - target)){ 19 subArrLen = Math.max(subArrLen, i - sumToInd.get(sum - target)); 20 } 21 22 sumToInd.putIfAbsent(sum, i); 23 } 24 25 return subArrLen == -1 ? -1 : nums.length - subArrLen; 26 } 27 }