Java 用窗口求和

Java 用窗口求和,java,algorithm,Java,Algorithm,我试图解决这个问题: 有一个列表和一个窗口。窗口显示要添加到列表中的元素数,例如: [4,2,73,11,-5]和窗口大小2应返回[6,75,84,6] 因此,我编写了如下代码: public static void main(String args[]){ LinkedList<Integer> l=new LinkedList<Integer>(); l.add(5); l.add(8); l.add(9); l.add(3);

我试图解决这个问题: 有一个列表和一个窗口。窗口显示要添加到列表中的元素数,例如:

[4,2,73,11,-5]
和窗口大小
2
应返回
[6,75,84,6]

因此,我编写了如下代码:

public static void main(String args[]){
    LinkedList<Integer> l=new LinkedList<Integer>();
    l.add(5);
    l.add(8);
    l.add(9);
    l.add(3);
    l.add(4);
    l.add(1);
    int window=2;
    int[] sum=new int[l.size()-window+1];

    for(int i=0;i<=l.size()-window; i++){
        for(int j=0;j<window; j++){
            sum[i]=sum[i]+l.get(i+j);
        }
    }
}
publicstaticvoidmain(字符串参数[]){
LinkedList l=新建LinkedList();
l、 增加(5);
l、 增加(8);
l、 增加(9);
l、 增加(3);
l、 增加(4);
l、 增加(1);
int窗口=2;
int[]sum=new int[l.size()-window+1];

对于(int i=0;i,您应该能够通过认识到当窗口从一个索引滑动到下一个索引时,一个和与下一个和之间的唯一区别是只添加了一个项目,只减去了一个项目,从而提高性能


i
for
循环的每次迭代中,您不需要重新计算
j
for
循环中的和。首先计算第一个
窗口的初始和
数字,这将保证
i
0
。然后在
i
循环的每次迭代中,从
1
,将索引
窗口+i处的值相加,然后减去索引
i处的值。这将提高性能,尤其是对于
窗口的高值
,这看起来像是一个家庭作业问题,所以我只会给出关于算法的提示,而不是实际代码:

  • 首先,计算第一个窗口的答案。将其保存在
    0
    th槽中
  • 对于下一步,将窗口向右移动一步:添加落入窗口的新整数,然后减去旧整数。将其保存到下一个插槽中
  • 重复此操作,直到窗口的末尾碰到输入数据的末尾

解决这个问题的一个更简单的方法是,不用做两个循环来获得窗口中的部分和,您可以将每个和结果保存在一个名为
current
的变量中。然后每次将窗口向右移动时,一个元素移出,一个新元素移入。因此,您可以通过添加新的移位来更新窗口和t-in元素并减去旧的shift-out元素。这样可以节省一些计算。总体时间复杂度为O(N)。代码如下所示

   public class WindowSum {
        public static int[] windowSum(int[] arr, int windowSize) {
            int[] sum = new int[arr.length-windowSize+1];
            int current = 0;
            for(int i=0; i<windowSize; i++)
                current += arr[i];
            sum[0] = current;
            for(int i=1; i<arr.length-windowSize+1; i++) {
                sum[i] = current + arr[i+windowSize-1] - arr[i-1];
                current = sum[i];
            }
            return sum;
        }

        public static void main(String[] args) {
            int[] num = {4, 2, 73, 11, -5};
            int[] sum = windowSum(num, 2);
            System.out.println(Arrays.toString(sum));
        }

    }
公共类WindowSum{
公共静态int[]windowSum(int[]arr,int windowSize){
int[]sum=new int[arr.length-windowSize+1];
int电流=0;

对于(int i=0;我感谢你,这帮了大忙。