回复
JAVA 单向队列和无队列生成窗口最大数组
hushuo
发布于 2021-1-12 14:14
浏览
0收藏
例如,数组值为[4,3,5,4,3,3,6,7],窗口大小为3时:
[4 3 5] 4 3 3 6 7 窗口中最大值为5
4 [3 5 4] 3 3 6 7 窗口中最大值为5
4 3 [5 4 3] 3 6 7 窗口中最大值为5
4 3 5 [4 3 3] 6 7 窗口中最大值为4
4 3 5 4 [3 3 6] 7 窗口中最大值为6
4 3 5 4 3 [3 6 7] 窗口中最大值为7
输入:整型数组arr, 窗口大小w。
输出:一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。
将算法分为两步
数组前w-1个内容入队
数组后n-w+1个内容依次入队,计算队列和,然后出队。
此方法时间复杂度为O(w*N),无队列方法为O(N)
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class Fanshe {
public static void main(String[] args) {
int [] a=sortArray(new int[] {1,2,8,9,5,3,4,6,2,8},3);
System.out.println(Arrays.toString(a));
}
static int [] sortArray(int [] a, int num) {
if(num>a.length || a==null || num<1)
return null;
int res [] = new int [a.length-num+1];
Queue <Integer> q = new LinkedList<Integer>();
for(int i=1;i<num;i++) {
q.add(a[i-1]);
}
for(int j=num; j<=a.length; j++) {
q.add(a[j-1]);
int nums =0;
for(Integer qi : q) {
nums+=qi;
}
res[j-num]=nums;
q.poll();
}
return res;
}
}
无队列方法如下:
import java.util.Arrays;
public class Fanshe {
public static void main(String[] args) {
int [] a=sortArray(new int[] {1,2,8,9,5,3,4,6,2,8},3);
System.out.println(Arrays.toString(a));
}
static int [] sortArray(int [] a, int num) {
if(num>a.length || a==null ||num<1)
return null;
int res [] = new int [a.length-num+1];
int sums = 0;
for(int i=1;i<num;i++) {
sums+=a[i-1];
}
for(int j=num; j<=a.length; j++) {
sums+=a[j-1];
res[j-num]=sums;
sums-=a[j-num];
}
return res;
}
}
赞
收藏
回复
相关推荐