环形数组队列求滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 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/sliding-window-maximum
我的解答
思路:窗口为一个数组,长度 k,每次移动相当于把原始数组的值放进这个窗口数组,位置为原始数组值的位置 index 跟 k 取模(去余),形成一个环形数组队列,并记录每次这个窗口内的最大值,最后返回每次最大值汇总的数组。
代码:
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {//基本判断,数组为空直接返回if(nums.length<1){return new int[]{};}//结果数组int[] result = new int[nums.length-k+1];//窗口数组int[] window = new int[k];//记录窗口内的最大值,第一位存放位置,第二位存放值int[] maxValue = new int[2];for (int i = 0; i < nums.length; i++) {int index = i % k;//将值放入环形数组这个窗口内window[index] = nums[i];if(i < k-1){//窗口满前直接存放值continue;}if(i == k-1){//第一次窗口满的时候计算最大值max(window,maxValue);}else{//窗口开始移动if(maxValue[1] < window[index]){//新进来的值更大,直接保存maxValue[0] = index;maxValue[1] = window[index];}else{//新进来的值没有更大,这时候就要看是否覆盖最大值,是的话重新计算最大值if(maxValue[0] == index){max(window,maxValue);}}}//保存每次的最大值result[i-k+1] = maxValue[1];}return result;}/*** 计算窗口内的最大值*/private void max(int[] window,int[] maxValue){maxValue[0] = 0;maxValue[1] = window[0];for (int i = 1; i < window.length; i++) {if (maxValue[1] < window[i]){maxValue[0] = i;maxValue[1] = window[i];}}}}
环形数组队列求滑动窗口最大值相关推荐
- Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值
文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...
- 求滑动窗口中的最大值和最小值
滑动窗口: 一般使用双指针算法,左指针l和右指针r之间的空间称为窗口,由于指针是不断移动的,从而窗口也可以移动,称为滑动窗口. 滑动窗口的最值: 由于窗口是移动的,移动的过程中有新元素的加入也有旧元素 ...
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- 栈和队列6:滑动窗口最大值
问题描述: 题目链接: 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. ...
- Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素
day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...
- 力扣239. 滑动窗口最大值(自定义排序队列)
239. 滑动窗口最大值 //实现功能:peek()取得队列的最大值,比最大值先添加进来的删除,后添加进来的保留 class Mydeque{Deque<Integer> deque;pu ...
- 【LeetCode】【HOT】239. 滑动窗口最大值(双向队列)
[LeetCode][HOT]239. 滑动窗口最大值 文章目录 [LeetCode][HOT]239. 滑动窗口最大值 package hot;import java.util.Arrays; im ...
- LeetCode 239:滑动窗口最大值 思考分析
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进阶: 你能在线性 ...
- 嗯,查询滑动窗口最大值的这4种方法不错....
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...
最新文章
- python 函数的嵌套 和 作用域链
- 人民币小写转大写php实现
- MySQL Windows ZIP 免费安装和启动设置
- linux系统给jvm分配来多少内存
- 网络协议分析工具Ethereal的使用
- IOS流水布局UICollectionView使用FlowLayout进行自由灵活组合
- 我历时3年才写了10余篇源码文章,但收获了100w+阅读
- Laravel源码解析之Request
- PageRank三个博客mark
- hexo 菜单_hexo+yilia搭建博客的坎坷历程
- 【计算机组成原理】计算机的发展及应用
- 自制ArduinoUno R3开发板,烧写bootloader
- IIS7下DataFormatString={0:c}人民币符号为?的问题
- 安卓模拟器突然不支持VT打不开模拟器的解决办法
- html5实习体会,html5实习心得体会.docx
- OpenCV中图像特征提取与描述
- 泰勒级数定义及相关展开式
- 16、持续集成流水线实践:流水线上的AI单元测试(MAVEN)
- 全渠道、多场景、跨平台,App如何借助数据分析渠道流量
- 电脑“C盘”快满了,怎么清理?