给定一个数组 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];}}}}

环形数组队列求滑动窗口最大值相关推荐

  1. Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值

    文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...

  2. 求滑动窗口中的最大值和最小值

    滑动窗口: 一般使用双指针算法,左指针l和右指针r之间的空间称为窗口,由于指针是不断移动的,从而窗口也可以移动,称为滑动窗口. 滑动窗口的最值: 由于窗口是移动的,移动的过程中有新元素的加入也有旧元素 ...

  3. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  4. 栈和队列6:滑动窗口最大值

    问题描述: 题目链接: 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. ...

  5. Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素

    day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...

  6. 力扣239. 滑动窗口最大值(自定义排序队列)

    239. 滑动窗口最大值 //实现功能:peek()取得队列的最大值,比最大值先添加进来的删除,后添加进来的保留 class Mydeque{Deque<Integer> deque;pu ...

  7. 【LeetCode】【HOT】239. 滑动窗口最大值(双向队列)

    [LeetCode][HOT]239. 滑动窗口最大值 文章目录 [LeetCode][HOT]239. 滑动窗口最大值 package hot;import java.util.Arrays; im ...

  8. LeetCode 239:滑动窗口最大值 思考分析

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进阶: 你能在线性 ...

  9. 嗯,查询滑动窗口最大值的这4种方法不错....

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 Github<小白学算法>系列:https://gith ...

最新文章

  1. python 函数的嵌套 和 作用域链
  2. 人民币小写转大写php实现
  3. MySQL Windows ZIP 免费安装和启动设置
  4. linux系统给jvm分配来多少内存
  5. 网络协议分析工具Ethereal的使用
  6. IOS流水布局UICollectionView使用FlowLayout进行自由灵活组合
  7. 我历时3年才写了10余篇源码文章,但收获了100w+阅读
  8. Laravel源码解析之Request
  9. PageRank三个博客mark
  10. hexo 菜单_hexo+yilia搭建博客的坎坷历程
  11. 【计算机组成原理】计算机的发展及应用
  12. 自制ArduinoUno R3开发板,烧写bootloader
  13. IIS7下DataFormatString={0:c}人民币符号为?的问题
  14. 安卓模拟器突然不支持VT打不开模拟器的解决办法
  15. html5实习体会,html5实习心得体会.docx
  16. OpenCV中图像特征提取与描述
  17. 泰勒级数定义及相关展开式
  18. 16、持续集成流水线实践:流水线上的AI单元测试(MAVEN)
  19. 全渠道、多场景、跨平台,App如何借助数据分析渠道流量
  20. 电脑“C盘”快满了,怎么清理?

热门文章

  1. geoserver xyz切片请求地址
  2. 如何实现APP自动化测试?
  3. PS--快速入门(简化版)
  4. 2022华东杯B题中证红利指数投资问题思路讲解
  5. 三菱FX3U PLC如何开启外部输入中断
  6. cmake学习笔记(七)编写自己的xxxConfig.cmake
  7. GigE发现设备——IP Configuration和Device Enumeration
  8. 从inpho的镶嵌线(line)到镶嵌网(polygon),并保留属性
  9. 支付宝,微信个人免签平台搭建
  10. 平板电视尺寸选择存在误区