给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例:

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

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;/*** 滑动窗口最大值*/
public class Solution {public Solution() {};/*** 遍历,暴力法* O(Nlogk)* @param nums* @param k* @return*/public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;if (n * k == 0) {return new int[0];}int[] output = new int[n - k + 1];for (int i = 0; i < n - k + 1; i++) {int max = Integer.MIN_VALUE;for (int j = i; j < i + k; j++) {max = Math.max(max, nums[j]);}output[i] = max;}return output;}/*** 双端队列* 滑动窗口作为双端队列* O(N)* @param nums* @param k* @return*/public int[] maxSlidingWindowDeque(int[] nums, int k) {int n = nums.length;if (n * k == 0) {return new int[0];}int[] output = new int[n - k + 1];Deque<Integer> window = new ArrayDeque<>();//也可以用数组模拟for (int i = 0; i < n; i++) {// 每次移动窗口时,窗口左边的元素从队列中删除if (i >= k && window.peek() <= i - k + 1) {window.remove(0);}// 新入队列元素,与队列中元素遍历比较,删除小于nums[i] 的元素while (!window.isEmpty() && nums[window.peekLast()] <= nums[i]) {window.removeLast();}window.add(i);// 队列左侧是最大值,加入结果if (i - k + 1 >= 0) {output[i - k + 1] = nums[window.peek()];}}return output;}public static void main(String[] args) {int[] aa = {3, 5, -1, 2, 8, 4};Solution ob = new Solution();int[] out = ob.maxSlidingWindowDeque(aa, 3);System.out.println(Arrays.toString(out));}
}

输出滑动窗口最大值(双端队列)相关推荐

  1. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

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

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

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

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

  4. leetcode 239. 滑动窗口最大值(单调队列)

    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例 1: 输 ...

  5. 算法学习-单调双端队列

    文章目录 基础知识 算法模板 相关题目 239.滑动窗口最大值 1438.绝对差不超过限制的最长连续子数组 862.和至少为K的最短子数组 1425.带限制的子序列和 1499.满足不等式的最大值 2 ...

  6. LeetCode 239. 滑动窗口最大值(双端队列+单调栈)

    文章目录 1. 题目信息 2. 解题 2.1 暴力法 2.2 双端队列法 1. 题目信息 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内 ...

  7. leetcode59题:滑动窗口的最大值(用双端队列实现)

    题目描述: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5, ...

  8. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]

    [问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...

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

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

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

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

最新文章

  1. 如何才能知道一个导师的人品?
  2. ISA2006实战系列之三:防火墙策略部署深度分析(附图)
  3. CASS 7.1 和 AutoCAD 2006的安装使用
  4. csdn的blog后台程序的导航菜单的实现
  5. MySQL String Types
  6. Java棘手面试问题
  7. 实现最小宽度的几种方法及CSS Expression
  8. 清除html中table标签显示的数据,遍历查看/新增/删除/获取html中table中的标签
  9. 为ASP.NET封装的SQL数据库访问类(转)
  10. slam十四讲第十讲:找不到 g2o_viewer
  11. 开发前奏曲之添加Android SDK平台工具
  12. 神经网络的参数(Weight)
  13. matlab中inf怎么判断,MATLAB中Inf或inf表示()、NaN或nan表示()、nargout表示()。
  14. 【清橙 A1206】小Z的袜子(莫队算法)
  15. C++产生随机数的例题:投骰子的随机游戏
  16. teamlab什么意思_不好意思,我们的2019毕业季聚会,和前辈的不一样
  17. 汇编MOVSX指令详解
  18. word添加水印后多出一条线的删除方法
  19. SAP FICO - Functional Area/ Financial Management Area(FM Area)
  20. C语言见缝插针游戏,见缝插针玩游戏

热门文章

  1. python中sorted_关于python中sorted方法的key参数
  2. php实现小说字典功能_PHP实现微信小程序人脸识别刷脸登录功能
  3. php指令,php命令行下的常用命令
  4. jpeg 转bmp代码_代码写得很牛逼但UI界面却搞得很丑?来,杨工带你!
  5. 在python中使用最小二乘法画出拟合曲线_Python基于最小二乘法实现曲线拟合示例...
  6. java 游戏 异步框架_基于Java的轻量级异步编程框架
  7. 计算机硬盘坏道解决办法
  8. nyoj(简单数学)Oh, my Paper!
  9. nyoj 买水果(组合数求法与分析)
  10. matlab程序中中零内插在qdpsk调制中的作用,桂林电子科技大学通信原理思考题