-
给定一个长度为n(n<=10^6)的数组。有一个大小为k的滑动窗口从数组的最左端移动到最右端。你可以看到窗口中的k个数字。窗口每次向右滑动一个数字的距离。下面是一个例子:数组是 [1 3 -1 -3 5 3 6 7], k = 3。
-
窗口位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7 -
你的任务是得到滑动窗口在每个位置时的最大值
输入
-
-
输入包括两行。
第一行包括n和k,分别表示数组的长度和窗口的大小。
第二行包括n个数字。
输出
-
输出包括两行。
第一行包括窗口从左至右移动的每个位置的最小值。
第二行包括窗口从左至右移动的每个位置的最大值。
样例输入
-
8 3 1 3 -1 -3 5 3 6 7
样例输出
-
3 3 5 5 6 7
-
这里只实现了求最大值,最小值类似。思路是利用双端队列实现窗口最大值的更新。 ·
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); int k = in.nextInt(); int a[] = new int[n]; for(int i=0;i<n;i++){ a[i] = in.nextInt(); } int b[] = new int[n-k+1]; b = getMaxWindow(a,k); for(int i=0;i<n-k;i++){ System.out.print(b[i]); } } public static int[] getMaxWindow(int[] arr,int w){ if(arr == null || w<1 || arr.length<w){ return null; } LinkedList<Integer> qmax = new LinkedList<Integer>(); int[] res = new int[arr.length-w+1]; int index = 0; for(int i=0;i<arr.length;i++){ while(!qmax.isEmpty() && arr[qmax.peekLast()]<=arr[i]){ qmax.pollLast(); } qmax.addLast(i); if(qmax.peekFirst() == i-w){ qmax.pollFirst(); } if(i>=w-1){ res[index++]=arr[qmax.peekFirst()]; } } return res; } }
滑动窗口
最新推荐文章于 2024-08-16 14:00:48 发布