zoukankan      html  css  js  c++  java
  • 剑指offer——68队列的最大值

    题目描述

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
     
    题解:
     滑动窗口原理很简单,就是开辟一个队列,队列里面存数组的下角标

      队头永远存的大数,队尾是小数,一旦出现比队尾大的数,则弹出队尾,将大数压入,使从大到小的顺序不变

      

     1 class Solution {
     2 public:
     3     vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
     4         if (num.size() == 0 || size <= 0 || size > num.size())return {};
     5         vector<int>res;
     6         deque<int>List;
     7         int L = 0, R = 0;
     8         while (R < num.size()) {
     9             while (!List.empty() && num[List.back()] < num[R])List.pop_back();
    10             List.push_back(R);
    11             ++R;
    12             if (R < size)continue;
    13             if (R == size)res.push_back(num[List.front()]);//第一个窗口
    14             else {//其他窗口
    15                 if (List.front() == L)List.pop_front();//最大数就是去除的左数,则删除该数
    16                 ++L;
    17                 res.push_back(num[List.front()]);
    18             }
    19         }
    20         return res;
    21     }
    22 };
     
  • 相关阅读:
    [转]VS2013自带SQL Server 的启用方法
    [转]CryptographyHelper.cs
    [转]Oracle 经验集
    程序的健壮性和鲁棒性
    死理性派恋爱法:拒绝掉前面37%的人
    Asp.net页面间传值方式汇总
    【操作系统】总结五(I/O管理)
    Windows编程
    【操作系统】磁盘
    【操作系统】文件系统
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11708695.html
Copyright © 2011-2022 走看看