算法原理: 第一眼看到这个题的时候,我真的想不到它到底是怎么和滑动窗口联系起来的,在我的脑海里只有一个简单的双指针。直到我看过了题解,才明白原来是这么回事:先看题目是求最小操作数,此时你一定不要先定义一个count来记录步数,不仅会多加一步代码,还可能搞不对。你就利用你的left和right来计算步数就行了。此题最巧妙的莫过于初始化left为-1,right为0,让后将-1~ left都作为左边的和,记为lsum;right~n都作为右边的和,记为rsum ,然后将左右区间和并作为滑动窗口,详细解释如下:注意: 开始的时候,是将整个数组都看成了rsum区间。 代码实现: class Solution { public int minOperations(int[] nums, int x) { int left =-1,right =0,lsum =0, rsum =0,ret = 999999;//这里我定义的999999也是看到样例修改的,第一次定义的数太小了 //计算出右侧的rsum for(int i =0;i<nums.length;i++){ rsum+=nums[i]; } //这个条件是最后加上的,直到看到最后几个样例才补充上去 if(rsum<x) { return -1; } for(;right<=nums.length;right++){ while(lsum+rsum<x){//判断+进窗口 lsum+=nums[++left]; } if(lsum+rsum== x){//更新 ret = Math.min(ret,left+1+nums.length- right); } if(right<nums.length) {//这个判断纯纯是为了防止数组越界 rsum-=nums[right];//出窗口 } } return ret == 999999 ? -1:ret; } }