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;
 }
}

收藏
回复
举报
回复
    相关推荐