轉載請標明出處http://www.cnblogs.com/haozhengfei/p/a14049ec0869a8125a69f3af37471c77.html
滑動窗口練習題
第8節 滑動窗口練習題
有一個整型數組 arr 和一個大小為 w 的窗口從數組的最左邊滑到最右邊,窗口每次向右邊滑一個位置。 返回一個長度為n-w+1的數組res,res[i]表示每一種窗口狀態下的最大值。 以數組為[4,3,5,4,3,3,6,7],w=3為例。因為第一個窗口[4,3,5]的最大值為5,第二個窗口[3,5,4]的最大值為5,第三個窗口[5,4,3]的最大值為5。第四個窗口[4,3,3]的最大值為4。第五個窗口[3,3,6]的最大值為6。第六個窗口[3,6,7]的最大值為7。所以最終返回[5,5,5,4,6,7]。
給定整形數組arr及它的大小n,同時給定w,請返回res數組。保證w小於等於n,同時保證數組大小小於等於500。
測試樣例:
[4,3,5,4,3,3,6,7],8,3
返回:[5,5,5,4,6,7]
您的代碼已保存
答案正確:恭喜!您提交的程序通過了所有的測試用例
答案正確:恭喜!您提交的程序通過了所有的測試用例
代碼示例
1 package com.hzf.stack$queue; 2 3 /** 4 * 有一個整型數組 arr 和一個大小為 w 的窗口從數組的最左邊滑到最右邊,窗口每次向右邊滑一個位置。 5 * 返回一個長度為n-w+1的數組res,res[i]表示每一種窗口狀態下的最大值。 6 * 以數組為[4,3,5,4,3,3,6,7],w=3為例。因為第一個窗口[4 7 * ,3,5]的最大值為5,第二個窗口[3,5,4]的最大值為5,第三個窗口[5,4, 8 * 3]的最大值為5。第四個窗口[4,3,3]的最大值為4。第五個窗口[3,3 9 * ,6]的最大值為6。第六個窗口[3,6,7]的最大值為7。所以最終返回[5,5,5,4,6,7]。 10 * 11 * 給定整形數組arr及它的大小n,同時給定w,請返回res數組。保證w小於等於n,同時保證數組大小小於等於500。 12 * 13 * 測試樣例: [4,3,5,4,3,3,6,7],8,3 返回:[5,5,5,4,6,7] 14 * 15 * @author hzf 16 * 17 */ 18 public class SlideWindow { 19 public int[] slide(int[] arr, int n, int w) { 20 //result數組中保存每個窗口狀態下的最大值 21 int[] result = new int[n-w+1]; 22 23 //記錄雙端隊列隊頭的下標 ,隊尾下標 24 int[] qmax = new int[n]; 25 int front = 0, back = 0; 26 27 //j 標記是否達到窗口大小,同時記錄result中下一個應該放入的元素的下標 28 int j = 0; 29 30 for(int i=0; i<n; i++){ 31 32 while(front < back && arr[qmax[back-1]] < arr[i])//back為當前要往qmax中放入的值 33 back--; 34 qmax[back++] = i; 35 36 if(j+w-1 == i){ 37 //達到窗口長度 38 result[j] = arr[qmax[front]]; 39 j++; 40 } 41 /** 42 * 保證qmax中front所代表的索引不會過期, 43 * 這個索引的邊界就是:qmax[front]+w-1 == i,滿足這個條件front++,否則下一窗口就會過期 44 * 比如 45 * front back 46 * qmax 6 8 47 * arr 11 5 48 * 當窗口大小w==3時,假設此時result[j]取arr[qmax[front]],front沒有更新, 49 * 如果下一次的arr[9] = 4,那么有如下 50 * front back 51 * qmax 6 8 9 52 * arr 11 5 4 53 * 此時如果在上一步中沒有更新front,那么此時窗口[7,8,9]的最大值取的是arr[qmax[6]],顯然6已經過期 54 * 55 * 所以綜上所述,一旦qmax[front]所代表的索引達到該索引所能控制的邊界,front++,以防下一次該front已經過期 56 */ 57 if(qmax[front]+w-1 == i){ 58 //隊頭過期 59 front++; 60 } 61 } 62 return result; 63 } 64 }
