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

题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

知道滑动窗口,代码却写不出来

#define MIN(a ,b) ((a) < (b) ? (a) : (b))

int minOperations(int* nums, int numsSize, int x)
{
    int ans = INT_MAX;
    int sum = 0;
    for (int i = 0; i < numsSize; i++) {
        sum += nums[i];
    }
    if (sum < x) {
        return -1;
    }
    int left = -1;
    int right = 0;
    int lsum = 0; // left为-1,左边数组为空,前缀和为0
    int rsum = sum; // right为0,右边选中整个数组,后缀和为数组和sum
    while (left < numsSize) {
        if (left != -1) {
            lsum += nums[left]; // 更新前缀和
        }
        while (right < numsSize && lsum + rsum > x) {
            rsum -= nums[right++]; // 前缀和后缀和相加大于x,缩小右数组
        }
        if (lsum + rsum == x) {
            ans = MIN(ans, left + 1 + numsSize - right); // 更新最小操作数
        }
        left++;
    }
    return ans == INT_MAX ? -1 : ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值