题目:
这个题如果我们直接去思考方法是很困难的,因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反,思考一下,无论是怎么样的,最终这个数组都会分成三个部分左中右,而左右的组合就是我们进行的所有操作(极端情况下左或右长度为0),但不管怎样,都分成了连续的几块。左右之和若为x,那么中间的数组和就是sum-x(假设数组之和为sum),我们要找左右长度和最短,那么只要找中间数组最长即可。
具体思路:
定义同向双指针,然后“进窗口”,判断(sum是否>target,此处的sum是滑动窗口内之和,target是上面的sum-x),如果满足条件,则出窗口,然后更新结果,判断此时的sum是否=target,符合条件,记录长度,然后一次次取最大值
int Solution(vector<int>&nums,int x)
{int sum=0;for(a:nums) sum+=a;int target=sum-x;//如果if条件满足,则我减去所有的数都无法满足条件if(target<0) return -1;
int ret=-1;for(int left=0,right=0,tmp=0;right<nums.size();right++){//进窗口tmp+=nums[right];//判断,出窗口while(tmp>target)tmp-=nums[left++];//判断,更新结果if(tmp==target)ret=max(ret,right-left+1);}if(ret==-1)return ret;//走遍数组也没找到符合条件else return nums.size()-ret;
}