滑动窗体的最大值
  • 參与人数: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. 02 requests模块

    requests模块 requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests会比urllib更加方便,可以节约我们大 ...

  2. 嵩天老师的零基础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 ...

  3. oracle sqlplus 导出csv文件

    et colsep , set feedback off set heading off set trimout on spool D:\DBoracle\lfc.csv select '" ...

  4. hihoCoder#1141 二分·归并排序之逆序对

    原题地址 又是一道WA成狗的题,最后发现原来是结果溢出了.. 代码: #include <iostream> #include <cstring> using namespac ...

  5. 【BZOJ1237】配对(贪心,DP)

    题意:有n个a[i]和b[i],调整顺序使abs(a[i]-b[i])之和最小,但a[i]<>b[i].保证所有 Ai各不相同,Bi也各不相同. 30%的数据满足:n <= 104 ...

  6. 推荐10+必备的 WordPress 常用插件

    众多的WordPress插件,使得WordPress的功能得到了较大的扩展,但是也正是由于过多的插件,导致我们很难选择所需的插件.今天,倡萌就根据自己的经验,给WordPress新手推荐一些常用的插件 ...

  7. 2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数

    http://codeforces.com/gym/102058/problem/F 题意:平面上n个点  两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还 ...

  8. BZOJ——2563: 阿狸和桃子的游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2563 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit:  ...

  9. HDU——2768 Cat vs. Dog

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. Atom安装代码格式化插件atom-beautify

    官网:https://github.com/Glavin001/atom-beautify 效果: 使用: [cmd]-[shift]-[p]或者[ctrl]-[shift]-[p]