zoukankan      html  css  js  c++  java
  • 窗口最大值数组

    生成窗口最大值数组
    有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。
    例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时:
     
    [4 3 5] 4 3 3 6 7 窗口中最大值为5
    4 [3 5 4] 3 3 6 7 窗口中最大值为5
    4 3 [5 4 3] 3 6 7 窗口中最大值为5
    4 3 5 [4 3 3] 6 7 窗口中最大值为4
    4 3 5 4 [3 3 6] 7 窗口中最大值为6
    4 3 5 4 3 [3 6 7] 窗口中最大值为7
    结果应该返回[5,5,5,4,6,7]。
     
    简单代码如下:
     1 /**
     2  * 简单方法
     3  * 狗剩的美丽家园
     4  */
     5 #include <iostream>
     6 #include <vector>
     7 using namespace std;
     8 
     9 class Solution {
    10 public:
    11     int getMax(const int A[], int size) {
    12         int max_num = A[0];
    13         for (int i = 0; i < size; i++) {
    14             if (A[i] > max_num) {
    15                 max_num = A[i];
    16             }
    17         }
    18         return max_num;
    19     }
    20 
    21     vector<int> maxInWindows(const int A[], int n, int size) {
    22         vector<int> result;
    23         for (int i = 0; i < n - size + 1; i++) {
    24             int num = getMax(A + i, size);
    25             result.push_back(num);
    26         }
    27         return result;
    28     }
    29 };
    30 int main() {
    31     Solution s;
    32     const int A[] = {2,3,4,2,6,2,5,1};
    33     int size = 3;
    34     int n = sizeof(A) / sizeof(A[0]);
    35     vector<int> res;
    36     res = s.maxInWindows(A, n, size);
    37     for (int i = 0; i < res.size(); i++) {
    38         cout << res[i] << ",";
    39     }
    40 }

    时间复杂度为 O(N)的解法如下:

     1 /**
     2  * 双端队列
     3  * 狗剩的美丽家园
     4 **/
     5 
     6 #include <iostream>
     7 #include <vector>
     8 #include <deque>
     9 using namespace std;
    10 
    11 vector<int> maxInWindows(int A[], int n, int size) {
    12     deque<int> Q;
    13     vector<int> result;
    14     for (int i = 0; i < n; i++) {
    15         //当前元素大于等于队尾,队尾出队
    16         while (!Q.empty() && A[Q.back()] <= A[i]) {
    17             Q.pop_back();
    18         }
    19         Q.push_back(i);
    20 
    21         //窗口范围大于size,队头出队列
    22         if (Q.front() == i - size) {
    23             Q.pop_front();
    24         }
    25         if (i >= size - 1) {
    26             result.push_back(A[Q.front()]);
    27         }
    28     }
    29     return result;
    30 }
    31 
    32 int main() {
    33     int A[] = {2,3,4,2,6,2,5,1};
    34     int size = 3;
    35     int n = sizeof(A) / sizeof(A[0]);
    36     vector<int> res;
    37     res = maxInWindows(A, n, size);
    38     for (int i = 0; i < res.size(); i++) {
    39         cout << res[i] << ",";
    40     }
    41 }
  • 相关阅读:
    DoTween插件的使用
    Unity3D协程的简单使用
    排序和双指针,减小时间复杂度
    Unity3D自定义菜单组件
    滑动窗口思路分析
    Unity3D中的序列化特性和DLL特性
    求数组的交集,以及贪心算法的使用
    随笔开始啦
    实例26 循环体的过滤器
    实例25 终止循环体
  • 原文地址:https://www.cnblogs.com/gousheng/p/7922918.html
Copyright © 2011-2022 走看看