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常见算法数组元素的区间查找的主要内容,如果未能解决你的问题,请参考以下文章

常见排序查找算法

算法常见数组搜索算法

算法-二分查找1

Task 04:数组二分查找

程序员,你应该知道的二分查找算法

C语言二分查找算法,折半查找算法