找到查詢時間慢的sql 慢sql查詢 查詢慢sql
阿新 • • 發佈:2021-10-13
【題目描述】
給定一個大小為n≤106的陣列。
有一個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。
你只能在視窗中看到k個數字。
每次滑動視窗向右移動一個位置。
以下是一個例子:
該陣列為[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 |
你的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。
【輸入格式】
輸入包含兩行。
第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。
第二行有n個整數,代表陣列的具體數值。
同行資料之間用空格隔開。
【輸出格式】
輸出包含兩個。
第一行輸出,從左至右,每個位置滑動視窗中的最小值。
第二行輸出,從左至右,每個位置滑動視窗中的最大值。
【輸入樣例】
8 3
1 3 -1 -3 5 3 6 7
【輸出樣例】
-1 -3 -3 -3 3 3
3 3 5 5 6 7
使用單調佇列(儲存資料對應的下標)保持當前視窗中的最大值即可(最大值舉例):
①如果當前進入視窗的數字num比視窗末尾元素x要大,就不斷將視窗末尾元素x出隊,直到num < x,或者是隊空,並將num的下標入隊。需要注意的是如果遇到相等的情況,即num == x,x也需要出隊,因為num的下標比x更新
②如果當前隊頭元素下標pos已經滑出滑動視窗了,那麼就需要將其從隊頭出隊,判斷的依據就是比較pos與視窗末端滑到的位置i,如果pos < i - k + 1,就說明pos已經滑出視窗了,需要出隊。
1 #include <iostream> 2 #include <deque> 3 #include <algorithm> 4 using namespace std; 5 typedef long long LL; 6 int N,K; 7 LL num[1000009]; 8 int main() 9 { 10 cin >> N >> K;11 for(int i = 1;i <= N;++i) 12 { 13 cin >> num[i]; 14 } 15 deque<LL> que; 16 for(int i = 1;i <= N;++i) 17 { 18 while(!que.empty() && que.front() < (i-K+1)) 19 { 20 que.pop_front(); 21 } 22 while(!que.empty() && num[que.back()] >= num[i]) 23 { 24 que.pop_back(); 25 } 26 que.push_back(i); 27 if(i >= K) 28 cout << num[que.front()] << " "; 29 } 30 cout << endl; 31 while(!que.empty()) 32 { 33 que.pop_back(); 34 } 35 for(int i = 1;i <= N;++i) 36 { 37 while(!que.empty() && que.front() < (i-K+1)) 38 { 39 que.pop_front(); 40 } 41 while(!que.empty() && num[que.back()] <= num[i]) 42 { 43 que.pop_back(); 44 } 45 que.push_back(i); 46 if(i >= K) 47 cout << num[que.front()] << " "; 48 } 49 return 0; 50 }