13、【常見算法】數組元素的區間查找
阿新 • • 發佈:2018-10-22
例如 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、【常見算法】數組元素的區間查找