滑动窗体的最大值
  • 參与人数:767时间限制:1秒空间限制:32768K
  • 通过比例:21.61%
  • 最佳记录:0 ms|8552K(来自 )

题目描写叙述

给定一个数组和滑动窗体的大小。找出全部滑动窗体里数值的最大值。

比如。假设输入数组{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.推断当前最大值是否过期

2.新添加的值从队尾開始比較,把全部比他小的值丢掉

                                                   
单调队列。O(n)

链接:

rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking">http://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

/**
题目描写叙述 给定一个数组和滑动窗体的大小。找出全部滑动窗体里数值的最大值。
比如,假设输入数组{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.推断当前最大值是否过期
2.新添加的值从队尾開始比較,把全部比他小的值丢掉
单调队列,O(n)
*/
#include<cstdio>
#include<vector>
#include<deque>
#include<iostream>
#include<algorithm>
using namespace std; class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> ans;
if(num.size()<size || num.size()==0 || size<=0) return ans; deque<int> tmp; //双端队列
int len=size,mmax=-1,mj=-1;
for(int i=0;i<len;i++)
{
if(num[i]>mmax)
{
mmax=num[i];
mj=i;
}
} for(int i=mj;i<len;i++) tmp.push_back(i); //应该把len里最大值之后的全部下标放入容器。 而不是单单的
// tmp.push_back(mj);//前len里最大值的下标放入
ans.push_back(mmax);//将前len里最大值放入 for(int i=len;i<num.size();i++)
{ // deque<int>::iterator iter=tmp.begin();
// while(iter!=tmp.end())
// {
// cout<<*iter++<<" ";
// }cout<<endl; int t=num[i];
int k=tmp.front(); //最大值的下标
if(i-k >= len) //去掉已经过时的最大值! 。!
{
while(i-k >= len)
{
tmp.pop_front();
if(!tmp.empty())
k=tmp.front();
else {tmp.push_back(i);break;}
}
}
int j=tmp.back(); //最后一个值的下标 //添加新的数。并覆盖前面能覆盖的比自己小的值
if(i!=j && num[i]>=num[j])
{
while(num[i]>=num[j])
{
tmp.pop_back();
if(!tmp.empty())
j=tmp.back();
else break;
}
tmp.push_back(i);
}
else tmp.push_back(i); k=tmp.front();
ans.push_back(num[k]); }
return ans;
}
};
int main()
{
vector<int> arr;
unsigned int len=3;
/*
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
arr.push_back(4);
arr.push_back(6);
arr.push_back(2);
arr.push_back(3);
arr.push_back(2);
arr.push_back(5);
arr.push_back(1);
*/ arr.push_back(16);
arr.push_back(14);
arr.push_back(12);
arr.push_back(10);
arr.push_back(8);
arr.push_back(6);
arr.push_back(4);
arr.push_back(2);
/*
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
arr.push_back(2);
arr.push_back(6);
arr.push_back(2);
arr.push_back(5);
arr.push_back(1);
*/
Solution so;
arr=so.maxInWindows(arr,len);
vector<int>::iterator iter=arr.begin();
while(iter!=arr.end())
{
cout<<*iter++<<" ";
}cout<<endl;
return 0;
}

这些天的在学车。。。题目什么的,非常久没做了。,。立即就要考科二了,仅仅求飘过。

滑动窗体的最大值(STL的应用+剑指offer)的更多相关文章

  1. 滑动窗口的最大值 牛客网 剑指Offer

    滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...

  2. 【剑指Offer学习】【面试题65:滑动窗体的最大值】

    题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...

  3. 【Java】 剑指offer(59-1) 滑动窗口的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...

  4. Go语言实现:【剑指offer】滑动窗口的最大值

    该题目来源于牛客网<剑指offer>专题. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存 ...

  5. 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列

    剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...

  6. 【剑指offer】59 - I. 滑动窗口的最大值

    剑指 Offer 59 - I. 滑动窗口的最大值 知识点:队列:滑动窗口:单调 题目描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例 输入: nums = [ ...

  7. 力扣 - 剑指 Offer 59 - I. 滑动窗口的最大值

    题目 剑指 Offer 59 - I. 滑动窗口的最大值 思路1(单调队列) 使用单调(递减)队列,保持队列中的元素是递减顺序,队列头保存的是当前窗口中最大的元素 首先先模拟建立第一个窗口,同时获取第 ...

  8. 【剑指Offer】滑动窗口的最大值 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...

  9. 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)

    剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...

随机推荐

  1. Highlights in a Journal

    ** Highlights **** example- b huang, 2016, Design and performance enhancement of a bi-directional co ...

  2. [WPF自定义控件]使用WindowChrome自定义Window Style

    1. 为什么要自定义Window 对稍微有点规模的桌面软件来说自定义的Window几乎是标配了,一来设计师总是克制不住自己想想软件更个性化,为了UI的和谐修改Window也是必要的:二来多一行的空间可 ...

  3. 【转】关于RabbitMQ

    1      什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不 ...

  4. jenkins在linux环境搭建需要用到的linux命令

    需要用到的linux命令如下: 服务器jdk1.7/usr/java/jdk1.7.0_80 jdk1.8/home/hujb/javaJDK/jdk1.8.0_171保存文件时用 : w ! sud ...

  5. zoj 2736 Daffodil number

    Daffodil number Time Limit: 2 Seconds      Memory Limit: 65536 KB The daffodil number is one of the ...

  6. 【数据传输 1】服务器—>客户端之间的数据类型转换

    导读:在做项目的时候,在controller中,将List数据类型转换为了JSON字符串,那么,为什么要将其数据转换为JOSN呢?这样的转换是否是必须的,在这个转换过程中,又经过了那些步骤?注:本篇博 ...

  7. 解决Genymotion运行Android 5.0一直卡在开机界面

    在一些机器,启动genymotion 的android5.0版模拟器时,会卡在启动界面,一直启动不了. 这是因为要求的开启虚拟选项没有打开,在第一次启动时,会有提示,但可能大家没有注意(我也没注意到, ...

  8. 【POJ2774&Ural1517】Long Long Message(后缀数组)

    题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...

  9. Flex4分模块下样式动态加载步骤及相关问题的解决

    1.  给应用程序编写CSS文件 (1)在项目下创建CSS文件(任意路径,可以多个).本例在src下创建了5个样式文件 (2)Flex支持的CSS文件定义如下: a)  type selector(类 ...

  10. Python---django轻量级框架

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...