给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:

滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

提示:

你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  1.暴力解。

  2.双端队列模拟滑动窗口。使队头元素保持为滑动窗口的最大值,并根据滑动窗口的大小k删除队头元素。根据当前位置nums[i]值删除队尾元素。    

//暴力解, 二重循环
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> ans;
if(!nums.size())
return ans;
for(int i=0; i<nums.size()-k+1; i++){
int max=INT_MIN;
for(int j=i; j<i+k; j++){
if(nums[j]>max){ max = nums[j];
}
}
ans.push_back(max);
} return ans;
}
};
//双端队列模拟滑动窗口
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> ans;
if(nums.empty())
return ans;
deque<int> q;
for(int i=0; i<k; i++){
//队尾元素只能通过判别当前元素删除。且不能取等号。
while(!q.empty()&&q.back()<nums[i])
q.pop_back();
q.push_back(nums[i]); }
ans.push_back(q.front()); for(int i=k; i<nums.size(); i++){
//队头元素出队,周期为k。
if(q.front()==nums[i-k])
q.pop_front();
// while(q.front()<=nums[i]&&q.size()>0)
// q.pop_front();
while(!q.empty()&&q.back()<nums[i])
q.pop_back();
q.push_back(nums[i]);
ans.push_back(q.front());
} return ans;
}
};

剑指0ffer59.滑动窗口的最大值的更多相关文章

  1. 剑指offer——滑动窗口的最大值

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6, ...

  2. 剑指offer64:滑动窗口的最大值

    题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4, ...

  3. 剑指offer--50.滑动窗口的最大值

    时间限制:1秒 空间限制:32768K 热度指数:157641 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的 ...

  4. 剑指Offer-滑动窗口的最大值

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. window 下如何安装redis

    1.官方没有 Windows版本的 Redis,但是微软开发并维护了针对Win64的Windows版本. Windows版本下载地址:https://github.com/MicrosoftArchi ...

  2. 多线程-3.sleep() yield() join()

    1.sleep()方法 jdk文档描述:Causes the currently executing thread to sleep (temporarily cease execution) for ...

  3. 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...

  4. 腾讯暑期 前后七面 + hr(已拿offer面经)

    以下是时间线 魔方 魔术师工作室 3.19 一面(120mins) c++ struct和union区别? 指针和引用的区别? 左值和右值? 字节对齐的作用? 什么情况下需要自定义new? mallo ...

  5. 04.06 UCF Local Programming Contest 2017

    A.Electric Bill 题意:简单计算题,超过1000部分额外算 1 #include<stdio.h> 2 int main(){ 3 int money1,money2; 4 ...

  6. [Qt] 事件机制(二)

    在samp4_1中加一个小功能,点击右上角关闭按钮时,弹出"确认是否关闭"的消息框.如果点"yes"则关闭,如果点"No"则不关闭 在wid ...

  7. [笔记] 《我的第一本c++书》

    函数 优秀函数的五个要点 函数的返回值:直接返回和间接返回(指针) 在函数的入口处对参数有效性进行检验:if语句,断言(assert) 如果函数有返回值,不可返回一个指向函数体内局部对象的指针或引用 ...

  8. linux使用createrepo制作本地yum源

    目录 linux使用createrepo制作本地yum源 安装createrepo软件包 进入本地rpm包目录 执行完后可以看到生成的repodata目录 编辑yum配置文件使用 完成,测试使用 关于 ...

  9. 马哥Linux SysAdmin学习笔记(四)

    sed:编辑器 sed:Stream EDitor,行编辑器 用法: sed [option]... 'script' inputfile... script: '地址命令' 常用选项: -n:不输出 ...

  10. Java EnumMap 实现类

    EnumMap 实现类 因为 HashMap 是一种通过对 key 计算 hashCode(),通过空间换时间的方式,直接定位到 value 所在的内部数组的索引,因此,查找效率非常高. 如果作为 k ...