滑动窗体的最大值(STL的应用+剑指offer)
- 參与人数: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)
/**
题目描写叙述 给定一个数组和滑动窗体的大小。找出全部滑动窗体里数值的最大值。
比如,假设输入数组{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)的更多相关文章
- 滑动窗口的最大值 牛客网 剑指Offer
滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...
- 【剑指Offer学习】【面试题65:滑动窗体的最大值】
题目:给定一个数组和滑动窗体的大小,请找出全部滑动窗体里的最大值. 举例说明 比如,假设输入数组{2,3,4,2,6,2,5,1}及滑动窗体的大小.那么一共存在6个滑动窗体,它们的最大值分别为{4,4 ...
- 【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...
- Go语言实现:【剑指offer】滑动窗口的最大值
该题目来源于牛客网<剑指offer>专题. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存 ...
- 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列
剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...
- 【剑指offer】59 - I. 滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值 知识点:队列:滑动窗口:单调 题目描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例 输入: nums = [ ...
- 力扣 - 剑指 Offer 59 - I. 滑动窗口的最大值
题目 剑指 Offer 59 - I. 滑动窗口的最大值 思路1(单调队列) 使用单调(递减)队列,保持队列中的元素是递减顺序,队列头保存的是当前窗口中最大的元素 首先先模拟建立第一个窗口,同时获取第 ...
- 【剑指Offer】滑动窗口的最大值 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
随机推荐
- 02 requests模块
requests模块 requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests会比urllib更加方便,可以节约我们大 ...
- 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=15873837810484552531 中的1-14讲
#coding=gbk#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=1587383 ...
- oracle sqlplus 导出csv文件
et colsep , set feedback off set heading off set trimout on spool D:\DBoracle\lfc.csv select '" ...
- hihoCoder#1141 二分·归并排序之逆序对
原题地址 又是一道WA成狗的题,最后发现原来是结果溢出了.. 代码: #include <iostream> #include <cstring> using namespac ...
- 【BZOJ1237】配对(贪心,DP)
题意:有n个a[i]和b[i],调整顺序使abs(a[i]-b[i])之和最小,但a[i]<>b[i].保证所有 Ai各不相同,Bi也各不相同. 30%的数据满足:n <= 104 ...
- 推荐10+必备的 WordPress 常用插件
众多的WordPress插件,使得WordPress的功能得到了较大的扩展,但是也正是由于过多的插件,导致我们很难选择所需的插件.今天,倡萌就根据自己的经验,给WordPress新手推荐一些常用的插件 ...
- 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数
http://codeforces.com/gym/102058/problem/F 题意:平面上n个点 两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还 ...
- BZOJ——2563: 阿狸和桃子的游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=2563 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: ...
- HDU——2768 Cat vs. Dog
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Atom安装代码格式化插件atom-beautify
官网:https://github.com/Glavin001/atom-beautify 效果: 使用: [cmd]-[shift]-[p]或者[ctrl]-[shift]-[p]