码迷,mamicode.com
首页 > 编程语言 > 详细

13、【常见算法】数组元素的区间查找

时间:2018-10-22 20:28:15      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:class   返回   amp   chm   ace   div   pac   ras   窗口   

问题:给定一个包含 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、【常见算法】数组元素的区间查找

标签:class   返回   amp   chm   ace   div   pac   ras   窗口   

原文地址:https://www.cnblogs.com/Long-w/p/9831475.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!