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] << "\t"; 70  } 71 72 return 0; 73 }

猜你喜欢

转载自www.cnblogs.com/Long-w/p/9831475.html