算法--滑動窗口


轉載請標明出處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
import java.util.*;
2
 
                                   
3
public class SlideWindow {
4
    public int[] slide(int[] arr, int n, int w) {
5
        //result數組中保存每個窗口狀態下的最大值
6
        int[] result = new int[n-w+1];
7
 
                                   
8
        //記錄雙端隊列隊頭的下標 ,隊尾下標
9
        int[] qmax = new int[n];
10
        int front = 0, back = 0;
11
 
                                   
12
        //j 標記是否達到窗口大小,同時記錄result中下一個應該放入的元素的下標
13
        int j = 0;
14
 
                                   
15
        for(int i=0; i<n; i++){
16
 
                                   
17
            while(front < back && arr[qmax[back-1]] < arr[i])//back為當前要往qmax中放入的值
18
                back--;
19
            qmax[back++] = i;
20
 
                                   
21
            if(j+w-1 == i){
22
                //達到窗口長度
23
                result[j] = arr[qmax[front]];
24
                j++;
25
            }
26
            if(qmax[front]+w-1 == i){
27
                //隊頭過期
28
                front++;
29
            }
30
        } 
31
        return result;
32
    }
33
}
 
 
您的代碼已保存
答案正確:恭喜!您提交的程序通過了所有的測試用例
 
 
代碼示例
 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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM