zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    python实现简单的百度翻译
    有趣的if循环
    用python代码模拟登录网站
    解决kali中的中文乱码问题
    基于linux下的NIST数字测试(下)——测试过程
    基于linux下的NIST数字测试(上)——安装过程
    2019-2020-20199135 《网络攻防实践》第3周作业
    2019-2020-20199135 《网络攻防实践》第2周作业
    2019-2020-20199135《网络攻防实践》第1周作业
    20199135网络攻防与实践作业
  • 原文地址:https://www.cnblogs.com/Long-w/p/9831475.html
Copyright © 2011-2022 走看看