题目链接
首先我们先看一下题目如下
我们来解析一下这个题目其实也很简单说的是给你一个整数和一个数组问你每当移除最左边和左右边的某个数字时x也减去该元素的值,问你这里面的最佳方案是什么。(最佳方案的意思也就是删除最少的元素个数)
第一次看到这个题目的时候可能会有些发懵尤其是这个题目的提示说我们需要更改数组这势必会引起一些误导让我们以为需要在原数组上进行更改,但是其实这个题目并不需要那么麻烦,我们想一下假设一个数组的各个元素和为sum,对于一个数组来说我们消除两边的数字使得消除的数字和恰好等于x那么对于剩下的数字,不就是sum-x吗?那么按照逆向思维是不是说我们只需要找到一个窗口使得窗口中的元素恰好等于sum-x即可
想到这里我相信很多同学肯定一拍脑门想到我去这不就是滑动窗口的经典使用吗?是的事实也正是如此,那么现在我们来看一下步骤吧
第一步:计算出sum的值也就是该数组的每个元素相加的和
第二步初始化滑动窗口:
第三步指针移动:当right移动到right和left之间的元素和恰好等于sum-x的时候更新一下长度即可更新数据
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int left=0,right=0;
int sum=0;
int num=0;
for(int a:nums) sum+=a;//算数组中值总的大小
int target=sum-x;
int ret=-1;
if(target<0)return -1;
while(right<nums.size()&&left<nums.size())
{
num+=nums[right++];//进窗口
while(num>target&&left<nums.size()&&left>=0)
{
num-=nums[left];
left++;
}
if(num==target)//更新结果
{
ret=max(ret,right-left+1);
}
}
if(ret==-1)return -1;
else return nums.size()-ret;
}
};