日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

滑动窗口--单调队列

發(fā)布時(shí)間:2025/3/11 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 滑动窗口--单调队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給定一個(gè)大小為 n≤106 的數(shù)組。

有一個(gè)大小為 k 的滑動(dòng)窗口,它從數(shù)組的最左邊移動(dòng)到最右邊。

你只能在窗口中看到 k 個(gè)數(shù)字。

每次滑動(dòng)窗口向右移動(dòng)一個(gè)位置。

以下是一個(gè)例子:

該數(shù)組為 [1 3 -1 -3 5 3 6 7],k 為 3。

窗口位置 最小值 最大值
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7
你的任務(wù)是確定滑動(dòng)窗口位于每個(gè)位置時(shí),窗口中的最大值和最小值。

輸入格式
輸入包含兩行。

第一行包含兩個(gè)整數(shù) n 和 k,分別代表數(shù)組長(zhǎng)度和滑動(dòng)窗口的長(zhǎng)度。

第二行有 n 個(gè)整數(shù),代表數(shù)組的具體數(shù)值。

同行數(shù)據(jù)之間用空格隔開。

輸出格式
輸出包含兩個(gè)。

第一行輸出,從左至右,每個(gè)位置滑動(dòng)窗口中的最小值。

第二行輸出,從左至右,每個(gè)位置滑動(dòng)窗口中的最大值。

輸入樣例:
8 3
1 3 -1 -3 5 3 6 7
輸出樣例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7

import java.io.BufferedReader; import java.io.InputStreamReader;/*** Created with IntelliJ IDEA.** @Auther: zlf* @Date: 2021/04/04/22:54* @Description: 滑動(dòng)窗口的最大值和最小值 使用單調(diào)隊(duì)列解決*/ public class 滑動(dòng)窗口 {public static void main(String[] args) throws Exception {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String[] s = reader.readLine().split(" ");int n = Integer.valueOf(s[0]);int k = Integer.valueOf(s[1]);String[] chs = reader.readLine().split(" ");int nums[] = new int[n];for (int i = 0; i < n; i++) {nums[i] = Integer.valueOf(chs[i]);}int queue[] = new int[n];int hh = 0 ,tt = -1 ; // hh 隊(duì)頭,tt 隊(duì)尾// 找到滑動(dòng)窗口最小值for (int i = 0; i < n; i++) {// 保證隊(duì)頭在窗口內(nèi)if(hh <= tt && i-k+1 > queue[hh]) hh++;// 如果新加入的元素比隊(duì)尾小的話,說明該隊(duì)尾不需要了while(hh <= tt && nums[i] <= nums[queue[tt]] ) tt--;queue[++tt] = i;if(i >= k-1) System.out.print(nums[queue[hh]]+" ");}System.out.println();hh = 0;tt = -1;// 找到滑動(dòng)窗口最大值for (int i = 0; i < n; i++) {// 保證隊(duì)頭在窗口內(nèi)if(hh <= tt && i-k+1 > queue[hh]) hh++;// 如果新加入的元素比隊(duì)尾大的話,說明該隊(duì)尾不需要了while(hh <= tt && nums[i] >= nums[queue[tt]] ) tt--;queue[++tt] = i;if(i >= k-1) System.out.print(nums[queue[hh]]+" ");}System.out.println();} }

總結(jié)

以上是生活随笔為你收集整理的滑动窗口--单调队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。