My Twenty-Eighth Page - 滑动窗口最大值 - By Nicolas
这篇page是针对leetcode上的239.滑动窗口的最大值所写的。小尼先简单的说明一下这道题的题意,给出一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,需要返回滑动窗口的最大值。
首先小尼想到的方法是使用暴力法求解,就是先设一个for循环便利数组中所有的元素,然后再一次一次的便利k区间中的元素进行大小的比较,再放入到新的数组中,最后我们只需要返回将元素添加进去的数组即可,但是按照小尼这样的写法会超时,小尼先拉一下代码,体现一下思路:
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int index = 0;int n = nums.length;int[] result = new int[n-k+1];for(int i = 0;i<=n-k;i++){result[i] = getMax(nums,i,k);}return result;}public int getMax(int[] nums,int i,int k){int max = nums[i];for(int j = i;j<i+k-1;j++){if(nums[j+1] > max){max = nums[j+1];}}return max;} }
接下来小尼给大大家介绍一下通用的方法,利用队列求解,其实这里面的思路不是很难,小尼简答给大家说明一下,我们在队列中放入元素的前提有两个,一个是我们在队列中存放的元素一定是小于等于k个,然后我们一保证靠近出口的元素的大小大于靠近入口处的元素的大小,也就是说出口方向像入口方向排,我们元素的大小呈递减的模式,这里我们就需要注意,如果我们新入队的元素小于已经入队的元素,那么我们直接放入,正好符合上面我们给出的规定,如果我们新入队的元素大于我们已经入队的元素,那么我们直接将左边的元素(也就是我们已经入队的元素)直接弹出,我们为了得到没k个元素之间的最大值,我们先把数组加入k个元素,将第一种便利满足,自此以后我们开始放入一个元素同时也弹出一个元素,我们弹出的元素靠近出口,并且我们前面设置这么多的条件就是满足了我们最后弹出的元素一定满足是这k个区间元素里的最大的元素。小尼接下来拉一下代码:
class MyQueue{Deque<Integer> deque = new LinkedList<>();void poll(int val){if(!deque.isEmpty() && val == deque.peek()){deque.poll();}}void add(int val){while(!deque.isEmpty() && val > deque.getLast()){deque.removeLast();}deque.add(val);}int peek(){return deque.peek();} } class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length == 1){return nums;}int len = nums.length - k + 1;int[] res = new int[len];int num = 0;MyQueue myQueue = new MyQueue();for(int i = 0;i<k;i++){myQueue.add(nums[i]);}res[num++] = myQueue.peek();for (int i = k; i < nums.length; i++) {myQueue.poll(nums[i - k]);myQueue.add(nums[i]);res[num++] = myQueue.peek();}return res;
我们先定义了MyQueue类,然后这个方法中写入了三个方法,这三个方法分别对应丢出和加入还有返回头节点三个方法,然后我们下面的Solution方法里面,我们先将k个元素丢入,然后我们再从第二个k区间中开始判断是否进行增加、丢弃操作,最后我们把弹出的元素丢入我们的新创建的数组中,最后我们再return。
My Twenty-Eighth Page - 滑动窗口最大值 - By Nicolas相关推荐
- 嗯,查询滑动窗口最大值的这4种方法不错....
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...
- 【LeetCode】【HOT】239. 滑动窗口最大值(双向队列)
[LeetCode][HOT]239. 滑动窗口最大值 文章目录 [LeetCode][HOT]239. 滑动窗口最大值 package hot;import java.util.Arrays; im ...
- 滑动窗口最大值的golang实现
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值 输入: nums = [1 ...
- 你还在为查询滑动窗口最大值发愁吗?点开看最高效率解法!
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 头图 | CSDN 下载自东方IC 本文已收录至 Github<小白学算法>系列:https://github.c ...
- Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素
day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...
- 单调区间之239.滑动窗口最大值
单调区间 239. 滑动窗口最大值 这个题如果用普通的优先队列是有问题的,因为每次弹出去的不知道是上一个窗口的左边界还是这个窗口里的元素.我们要的是每次只弹出上一个窗口的左边界并且还能弹出最值,所以这 ...
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- CodeTop055 滑动窗口最大值
滑动窗口最大值 给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧. 你只可以看到在滑动窗口内的k个数字.滑动窗口每次只向右移动一位 返回滑动窗口中的最大值 使用双端队 ...
- 栈和队列6:滑动窗口最大值
问题描述: 题目链接: 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. ...
最新文章
- 跟我一起写 Makefile(七)
- 【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试
- docker svn
- node --- 后端使用body-parse解析Post请求,前端使用axios发送Post请求
- 理论基础 —— 线性表 —— 双向链表
- SpringBoot使用@ServerEndpoint无法依赖注入问题解决 SpringBoot webSocket配置
- 以色列网络武器出口对象国从102个锐减至37个
- 字符串标志“ u”和“ r”到底是做什么的,什么是原始字符串文字?
- matlab y轴旋转面,Mayavi:绕y轴旋转
- linux mysql cpu 查看工具_Linux监控工具-Nmon命令行:Linux系统性能的监测利器
- 数据分析案例:商场客户分群
- Spring-MVC配置Gson做为Message Converter解析Json
- 一级计算机选择题汇总,计算机一级考试选择题汇总.pdf
- 云计算和大数据时代网络技术揭秘
- 运维团队(OPS)与技术团队有效沟通配合探讨
- matlab改变图片尺寸及像素与尺寸的转换
- 脾胃湿热吃什么药.体内湿气重有何表示 怎样去除
- 算术右移和逻辑右移区别
- 设置网页只允许在手机微信浏览器打开
- 免费搭建企业级直播平台,破解H5Storm限制
热门文章
- 利用python制作语音变声器,这么牛的技术还不来学?
- 快手宣布将实行大小周,打工人何时能正常上下班?
- Pypi上传自己库时报错的解决方案(巨详细)
- UG NX二次开发(C#)-CAM-获取所有的加工刀具表单
- 投屏为什么显示无法连接服务器,乐播投屏为什么连不上? 乐播投屏无法连接如何解决?...
- 半导体材料 MOOC学习记录 第十二章 II-VI族化合物半导体
- XXL-JOB的使用(详细教程)
- 手机发出微弱信号是如何被接收?
- 多巴胺测定,多巴胺ELISA试剂盒,多功能研究
- 五大原因!为何要将Jupyter Notebook转换为python脚本?