1. 程式人生 > >13、【常見算法】數組元素的區間查找

13、【常見算法】數組元素的區間查找

例如 ron div code num else idl 問題: 組元

問題:給定一個包含 n 個整數的數組,和一個大小為 k 的滑動窗口,從左到右在數組中滑動這個窗口,找到數組中每個窗口內的中位數。(如果數組個數是偶數,則在該窗口排序數字後,返回第 N/2 個數字。)
例如:對於向量[1,2,7,8,5],窗口大小3,輸出的結果為 [2,7,7]
要求: 非暴力求解

 1 /*
 2 給定一個包含 n 個整數的數組,和一個大小為 k 的滑動窗口,從左到右在數組中滑動這個窗口,
 3 找到數組中每個窗口內的中位數。(如果數組個數是偶數,則在該窗口排序數字後,返回第 N/2 個數字。)
 4 例如:
 5 對於向量[1,2,7,8,5],窗口大小3,輸出的結果為 [2,7,7]
 6 要求: 非暴力求解
 7 */
 8 #include <iostream>
 9 #include <vector>
10 #include <set>
11 
12 using namespace std;
13 
14 vector<int> searchMidlle(vector<int> &arr, int k)
15 {
16     vector<int> result;
17 
18     int n = arr.size();
19     //cout << n << endl;
20 
21     if(n == 0)
22         return result;
23     multiset<int> max, min;
24     for(int i = 0; i < k; i++)
25         max.insert(arr[i]);
26     for(int i = 0; i < k/2; i++)
27     {
28         min.insert(*max.rbegin());
29         max.erase(max.lower_bound(*max.rbegin()));
30     }
31     for(int i = k; i < n; i++)
32     {
33         result.push_back(*max.rbegin());
34         if(max.find(arr[i-k]) != max.end())
35         {
36             max.erase(max.find(arr[i-k]));
37             max.insert(arr[i]);
38         }
39         else
40         {
41             min.erase(min.find(arr[i-k]));
42             min.insert(arr[i]);
43         }
44         if(max.size() > 0 && min.size() && *max.rbegin() > *min.rbegin())
45         {
46             int tmp = *max.rbegin();
47             max.erase(max.lower_bound(*max.rbegin()));
48             max.insert(*min.begin());
49             min.erase(min.begin());
50             min.insert(tmp);
51         }
52     }
53     result.push_back(*max.rbegin());
54     return result;
55 }
56 
57 int main()
58 {
59     int a[5] = {1, 2, 7, 8, 5};
60     vector<int> arr;
61     arr.insert(arr.begin(), a, a+5);
62 
63     int n = 3;
64     vector<int> &nums = arr;
65     vector<int> res = searchMidlle(nums, n);
66 
67     for(int i = 0; i < res.size(); i++)
68     {
69         cout << res[i] << "\t";
70     }
71 
72     return 0;
73 }

13、【常見算法】數組元素的區間查找