LintCode第604题-滑动窗口内数的和
描述
给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和
样例 1
输入:array = [1,2,7,8,5], k = 3
输出:[10,17,20]
解析:
1 + 2 + 7 = 10
2 + 7 + 8 = 17
7 + 8 + 5 = 20
思路:由于题目给出的是滑动窗口 首先想到双指针法 即固定的滑动窗口 先扩到 k,再记一次并收缩一次 直至遍历完所有的数组元素
4关键步骤
1.边界与结果长度
2.扩窗累加(右指针 j 往右走)
3.窗口满足长度 k 时记录答案
4.写完就滑动窗口(收缩左端)
代码如下:
public class Solution {
/**
* @param nums: a list of integers.
* @param k: length of window.
* @return: the sum of the element inside the window at each moving.
*/
public int[] winSum(int[] nums, int k) {
// write your code here
//边界与结果长度
if (nums == null || nums.length == 0 || k <= 0 || k > nums.length) {
return new int[0];
}
int numsLength=nums.length;
int returnNumsLength=numsLength-k+1;//统计返回数组的长度大小
int[] returnNums=new int[returnNumsLength];
int currentSum=0;
int returnNumsIndex=0;
//统计累加和 符合条件就记录 不符合记录进行累加和适当的减少
for(int i=0,j=0;i<numsLength&&j<numsLength;j++)//双指针法 扩窗累加(右指针 j 往右走)
{
currentSum=currentSum+nums[j];//累加
if(j-i+1<k)
{
}else if(j-i+1==k) //窗口满足长度 k 时记录答案
{
returnNums[returnNumsIndex]=currentSum;
if(returnNumsIndex<returnNumsLength-1)
{
returnNumsIndex++;
}
currentSum=currentSum-nums[i];//适当的减少 减去最前面一位 即写完收缩
i++;
}
}
return returnNums;
}
}