13常见算法数组元素的区间查找
Posted long-w
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13常见算法数组元素的区间查找相关的知识,希望对你有一定的参考价值。
问题:给定一个包含 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] << " ";
70 }
71
72 return 0;
73 }
以上是关于13常见算法数组元素的区间查找的主要内容,如果未能解决你的问题,请参考以下文章