Welcome to Subscribe On Youtube
1658. Minimum Operations to Reduce X to Zero
Description
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
Solutions
-
class Solution { public int minOperations(int[] nums, int x) { x = -x; for (int v : nums) { x += v; } Map<Integer, Integer> vis = new HashMap<>(); vis.put(0, -1); int n = nums.length; int ans = 1 << 30; for (int i = 0, s = 0; i < n; ++i) { s += nums[i]; vis.putIfAbsent(s, i); if (vis.containsKey(s - x)) { int j = vis.get(s - x); ans = Math.min(ans, n - (i - j)); } } return ans == 1 << 30 ? -1 : ans; } }
-
class Solution { public: int minOperations(vector<int>& nums, int x) { x = accumulate(nums.begin(), nums.end(), 0) - x; unordered_map<int, int> vis{ {0, -1} }; int n = nums.size(); int ans = 1 << 30; for (int i = 0, s = 0; i < n; ++i) { s += nums[i]; if (!vis.count(s)) { vis[s] = i; } if (vis.count(s - x)) { int j = vis[s - x]; ans = min(ans, n - (i - j)); } } return ans == 1 << 30 ? -1 : ans; } };
-
class Solution: def minOperations(self, nums: List[int], x: int) -> int: x = sum(nums) - x vis = {0: -1} ans = inf s, n = 0, len(nums) for i, v in enumerate(nums): s += v if s not in vis: vis[s] = i if s - x in vis: j = vis[s - x] ans = min(ans, n - (i - j)) return -1 if ans == inf else ans
-
func minOperations(nums []int, x int) int { x = -x for _, v := range nums { x += v } vis := map[int]int{0: -1} ans := 1 << 30 s, n := 0, len(nums) for i, v := range nums { s += v if _, ok := vis[s]; !ok { vis[s] = i } if j, ok := vis[s-x]; ok { ans = min(ans, n-(i-j)) } } if ans == 1<<30 { return -1 } return ans }
-
function minOperations(nums: number[], x: number): number { x = nums.reduce((a, b) => a + b, 0) - x; const vis = new Map(); vis.set(0, -1); const n = nums.length; let ans = 1 << 30; for (let i = 0, s = 0; i < n; ++i) { s += nums[i]; if (!vis.has(s)) { vis.set(s, i); } if (vis.has(s - x)) { const j = vis.get(s - x); ans = Math.min(ans, n - (i - j)); } } return ans == 1 << 30 ? -1 : ans; }
-
impl Solution { pub fn min_operations(nums: Vec<i32>, x: i32) -> i32 { let n = nums.len(); let target = nums.iter().sum::<i32>() - x; if target < 0 { return -1; } let mut ans = i32::MAX; let mut sum = 0; let mut i = 0; for j in 0..n { sum += nums[j]; while sum > target { sum -= nums[i]; i += 1; } if sum == target { ans = ans.min((n - 1 - (j - i)) as i32); } } if ans == i32::MAX { return -1; } ans } }