滑动窗体的最大值(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 ...
随机推荐
- python基础002
1.pycharm安装与添加解释器 专业版.英文界面,不要汉化—一定要尊重知识产权 算术运算符:+ - * / // % ** ^ 布尔运算符:== > < >= <= 逻辑运 ...
- django的基本操作流程
pip install django cd Desktop/课上代码02/ #进入到创建项目的目录 django-admin startproject 项目的名称 #创建项目 __ini ...
- C#语言之字符串和正则表达式
本文将完成以下两个目标: 一.创建字符串: 二.正则表达式: 首先,我先来介绍一下System.String类: System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作. 使 ...
- 【HIHOCODER 1039】 字符消除
链接 问题描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被 ...
- Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
Java对象中的wait,notify以及notifyAll方法 在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定.这三个方法就是wait(),notif ...
- loadrunner协议开发
可以参考loadrunner自带的VuGen Guild文档,里面详细描述了所有协议的录制和开发内容
- 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean 就是我们定义的bean无法进行注入,那到底是什 ...
- 使用dd命令快速生成大文件或者小文件的方法
使用dd命令快速生成大文件或者小文件的方法 转载请说明出处:http://blog.csdn.net/cywosp/article/details/9674757 在程序的测试中有些场 ...
- BZOJ1700: [Usaco2007 Jan]Problem Solving 解题
每月m<=1000块钱,有n<=300道题,要按顺序做,每月做题要花钱,花钱要第一个月预付下个月立即再付一次,给出预付和再付求最少几个月做完题,第一个月不做. 神奇的DP..竟没想出来.. ...
- php统计图类库JpGraph
php统计图类库JpGraph JpGraph官网地址:https://jpgraph.net/. (1)下载类库: 下载地址:https://jpgraph.net/download/. 选择版本, ...