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

解题思路:滑动窗口

主要思想:正难逆简 题目需要左找一个数 右找一个数 我们不如直接找中间最长的一连串子数让这串子树和为  数组子树和减去X   找不到就返回 -1

滑动窗口双指针从左端出发,进行 进窗口 判断 出窗口 更新结果四个步骤

代码如下

class Solution {
public:
    int minOperations(vector<int>& nums, int x) 
    {
       int left=0,right=0,sum=0,ret=-1;
       for(auto i:nums)
       {
        sum+=i;
       }
       int target=sum-x;//中间那串字串之和要为target
       if(target<0) return -1;
       sum=0;
       for(;right<nums.size();right++)
       {
          sum+=nums[right];//进窗口
          while(sum>target)//判断
          {
            sum-=nums[left++];//出窗口
          }   
          if(sum==target)
          {
            ret=max(ret,right-left+1);
          }
       }
       if(ret==-1)
       {
        return ret;
       }
       return nums.size()-ret;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值