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 }
  • 相关阅读:
    VOA 2009/11/02 DEVELOPMENT REPORT In Kenya, a Better Life Through Mobile Money
    2009.11.26教育报道在美留学生数量创历史新高
    Java中如何实现Tree的数据结构算法
    The Python Tutorial
    VOA HEALTH REPORT Debate Over New Guidelines for Breast Cancer Screening
    VOA ECONOMICS REPORT Nearly Half of US Jobs Now Held by Women
    VOA ECONOMICS REPORT Junior Achievement Marks 90 Years of Business Education
    VOA 2009/11/07 IN THE NEWS A Second Term for Karzai; US Jobless Rate at 10.2%
    Ant入门
    Python 与系统管理
  • 原文地址:https://www.cnblogs.com/Long-w/p/9831475.html
Copyright © 2011-2022 走看看