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's 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

从给定数组左边和右边取连续的数,问最少的取数个数能让和等于x。问题可以转化为找最长子数组使得和为sum - x =>动态窗口。也可以看成左右此消彼长的过程,两个指针先让左边的尽量取直到取到x,之后再从右边开始取,每次取一个数后将左边指针退到左右总和不超过x的位置,以此类推直到右指针往前走完所有可能的位置,是形式稍微特别些的动态窗口。

class Solution:
    def minOperations(self, nums: List[int], x: int) -> int:
        N = len(nums)
        l, r, s, cnt, res = 0, N - 1, 0, 0, float('inf')
        while l < N and s + nums[l] <= x:
            s += nums[l]
            l += 1
            cnt += 1
            if s == x: res = min(res, cnt)
        if l == N and s < x: return -1
        l -= 1
        while r >= 0:
            cnt += 1
            s += nums[r]
            while l >= 0 and s > x:
                cnt -= 1
                s -= nums[l]
                l -= 1
            if s == x: res = min(res, cnt)
            r -= 1
        return -1 if res == float('inf') else res
    

Last updated