1658. 将 x 减到 0 的最小操作数

太久没有写算法题而且算法底子本就薄弱导致这个题总感觉很熟悉却怎么也写不出的情况😞。

进入正文,本题就是一个滑动窗口问题,可以看成是一个连接好的和为\(sum-x\)的窗口,也可以看成首尾两部分共同组成的值为\(x\)的滑动窗口,所以采取滑动窗口算法即可解决,下面是官方代码:

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size();
        int sum = accumulate(nums.begin(), nums.end(), 0);

        if (sum < x) {
            return -1;
        }

        int right = 0;
        int lsum = 0, rsum = sum;
        int ans = n + 1;

        for (int left = -1; left < n; ++left) {
            if (left != -1) {
                lsum += nums[left];
            }
            while (right < n && lsum + rsum > x) {
                rsum -= nums[right];
                ++right;
            }
            if (lsum + rsum == x) {
                ans = min(ans, (left + 1) + (n - right));
            }
        }

        return ans > n ? -1 : ans;
    }
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/solution/jiang-x-jian-dao-0-de-zui-xiao-cao-zuo-s-hl7u/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2023-01-07 16:30  Lord-Phantom-city  阅读(27)  评论(0)    收藏  举报