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;我感谢你,这帮了大忙。