滑动窗口问题

xiaoxiao2021-02-28  73

Judge:http://dsalgo.openjudge.cn/stackqueue/7/ 题意:给定一个长度为n(n<=10^6)的数组。有一个大小为k的滑动窗口从数组的最左端移动到最右端。求滑动窗口在每个位置时的最大值和最小值。 总时间限制:12000ms

可以使用单调队列来做这道题。

#include <cstdio> #include <deque> using namespace std; #define MODE_MAX 1 #define MODE_MIN 0 int g_iNumTot, g_iWndLen, g_arrNum[1000010]; deque<int> g_queHumMin, g_queHumMax; void InsertQueue(deque<int> & theQueue, int iMode, int iData) { int iSize = theQueue.size(); for (int i = 1; i <= iSize; i++) if (iMode == MODE_MAX && theQueue.back() < iData) theQueue.pop_back(); else if (iMode == MODE_MIN && theQueue.back() > iData) theQueue.pop_back(); else break; theQueue.push_back(iData); } int g_arrResMin[1000000], g_arrResMax[1000000]; int main() { scanf("%d%d", &g_iNumTot, &g_iWndLen); int iNum; for (int i = 1; i <= g_iNumTot; i++) { scanf("%d", &iNum); g_arrNum[i] = iNum; if (i <= g_iWndLen) { InsertQueue(g_queHumMin, MODE_MIN, iNum); InsertQueue(g_queHumMax, MODE_MAX, iNum); if (i < g_iWndLen) continue; } if (i > g_iWndLen) { if (g_queHumMin.front() == g_arrNum[i - g_iWndLen]) g_queHumMin.pop_front(); if (g_queHumMax.front() == g_arrNum[i - g_iWndLen]) g_queHumMax.pop_front(); InsertQueue(g_queHumMin, MODE_MIN, iNum); InsertQueue(g_queHumMax, MODE_MAX, iNum); } g_arrResMin[i - g_iWndLen] = g_queHumMin.front(); g_arrResMax[i - g_iWndLen] = g_queHumMax.front(); } for (int i = 0; i < g_iNumTot - (g_iWndLen - 1); i++) printf("%d ", g_arrResMin[i]); printf("\n"); for (int i = 0; i < g_iNumTot - (g_iWndLen - 1); i++) printf("%d ", g_arrResMax[i]); return 0; }

转载请注明原文地址: https://www.6miu.com/read-51074.html

最新回复(0)