1. 程式人生 > 其它 >找到查詢時間慢的sql 慢sql查詢 查詢慢sql

找到查詢時間慢的sql 慢sql查詢 查詢慢sql

題目描述

給定一個大小為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 }