• leetcode - 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.
    
    • 1
    • 2
    • 3

    Example 2:

    Input: nums = [5,6,7,8,9], x = 4
    Output: -1
    
    • 1
    • 2

    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.
    
    • 1
    • 2
    • 3

    Constraints:

    1 <= nums.length <= 10^5
    1 <= nums[i] <= 10^4
    1 <= x <= 10^9
    
    • 1
    • 2
    • 3

    Solution

    Recursive (TLE)

    Every time try with leftest and rightest items.

    Time complexity: o ( 2 n ) o(2^n) o(2n)
    Space complexity: o ( n ) o(n) o(n)

    Sliding window

    Solved after help.

    Think in reverse; instead of finding the minimum prefix + suffix, find the maximum subarray.

    So the problem becomes: to find the longest subarray with target sum.

    Time complexity: o ( n ) o(n) o(n)
    Space complexity: o ( 1 ) o(1) o(1)

    Code

    Recursive (TLE)

    class Solution:
        def minOperations(self, nums: List[int], x: int) -> int:
            def helper(left: int, right: int, x: int) -> int:
                if x == 0:
                    return 0
                if left > right:
                    return -1
                candidates = []
                if x - nums[left] >= 0:
                    next_cnt = helper(left + 1, right, x - nums[left])
                    if next_cnt != -1:
                        candidates.append(next_cnt + 1)
                if x - nums[right] >= 0:
                    next_cnt = helper(left, right - 1, x - nums[right])
                    if next_cnt != -1:
                        candidates.append(1 + next_cnt)
                return min(candidates) if candidates else -1
            return helper(0, len(nums) - 1, x)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Sliding window

    class Solution:
        def minOperations(self, nums: List[int], x: int) -> int:
            array_sum = sum(nums) - x
            if array_sum < 0:
                return -1
            res = -1
            left = 0
            cur_sum = 0
            for right in range(len(nums)):
                cur_sum += nums[right]
                while cur_sum > array_sum:
                    cur_sum -= nums[left]
                    left += 1
                if cur_sum == array_sum:
                    res = max(res, right - left + 1)
            return -1 if res == -1 else len(nums) - res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    centos 非root用户安装nginx
    从板凳围观到玩转行家:Moonbeam投票委托如何让普通用户一同参与
    Spire.Office for Java 7.9.9 ---2022-09-30
    【Python中图像相似性度量方法全面总结】
    申请400开头电话的步骤及注意事项
    用Python做数据分析之数据筛选及分类汇总
    十九、一起学习Lua 垃圾回收
    HarmonyOS 远端状态订阅开发实例
    Java架构师之路七、大数据:Hadoop、Spark、Hive、HBase、Kafka等
    http/2 二进制分帧层 (Binary Framing Layer)讲解
  • 原文地址:https://blog.csdn.net/sinat_41679123/article/details/133191083