首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Bubble Sort - 冒泡排序
Selection Sort - 选择排序
Insertion Sort - 插入排序
Merge Sort - 归并排序
Quick Sort - 快速排序
Heap Sort - 堆排序
Bucket Sort
Counting Sort
两数之和
两数相加
无重复字符的最长子字符串
两个排序数组的中值
最长回文子串
锯齿形变换
反转整数
合并K个排序列表
链表循环
除Self之外的数组乘积
4的威力
蛙跳
将交叉口大小设置为至少两个
最大的块,使其分类
到达点
阶乘零点函数的前像大小
建造一个大的岛屿
唯一字母串
树的距离之和
猜词游戏
节点的最短路径
矩形区域II
K-相似字符串
雇佣K工人的最低成本
至少为K的最短子阵
获取所有key的最短路径
加油站的最小数量
有利可图的计划
细分图中的可达节点
超级蛋掉落
最大频率叠加
有序队列
DI序列的有效置换
猫和老鼠
最长不含重复字符的子字符串
丑数
第一个只出现一次的字符
字符流中第一个不重复的字符
两个链表的第一个公共结点
数字在排序数组中出现的次数
0到n-1中缺失的数字
数组中数值和下标相等的元素
二叉树的深度
数组中只出现一次的两个数字
数组中唯一只出现一次的数字
翻转单词顺序
左旋转字符串
滑动窗口的最大值
当前位置:
首页>>
技术小册>>
数据结构与算法(中)
小册名称:数据结构与算法(中)
### 题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 例如,如果输入数组 `[2, 3, 4, 2, 6, 2, 5, 1]` 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,它们的最大值分别为 `[4, 4, 6, 6, 6, 5]`。 **注意:** - 数据保证 k 大于 0,且 k 小于等于数组长度。 **样例** ``` 输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3 输出: [4, 4, 6, 6, 6, 5] ``` ### 解法 使用一个双端队列,保证队首存放的是窗口最大值的下标。遍历数组, 1. 队尾元素比要入队的元素小,则把其移除(因为不可能成为窗口最大值)。 2. 队首下标对应的元素不在窗口内(即窗口最大值),将其从队列中移除。 3. 把每次滑动值的下标加入队列中(经过步骤1、2,此时加入队列的下标要么是当前窗口最大值的下标,要么是小于窗口最大值的下标)。 4. 滑动窗口的首地址i大于size就写入窗口最大值。 time complexity:O(n) space complexity:O(k) , k is the size ```java /** * @author mcrwayfun * @version v1.0 * @date Created in 2019/02/05 * @description */ class Solution { public ArrayList<Integer> maxInWindows(int[] num, int size) { ArrayList<Integer> reList = new ArrayList<>(); if (num == null || num.length < size || size < 1) { return reList; } Deque<Integer> deque = new LinkedList<>(); for (int i = 0; i < num.length; i++) { // 队尾元素比要入队的元素小,则把其移除(因为不可能成为窗口最大值) while (!deque.isEmpty() && num[deque.getLast()] <= num[i]) { deque.pollLast(); } // 队首下标对应的元素不在窗口内(即窗口最大值),将其从队列中移除 while (!deque.isEmpty() && (i - deque.getFirst() + 1 > size)) { deque.pollFirst(); } // 把每次滑动的值加入到队列中 deque.add(i); // 滑动窗口的首地址i大于size就写入窗口最大值 if (!deque.isEmpty() && i + 1 >= size) { reList.add(num[deque.getFirst()]); } } return reList; } } ``` ### 测试用例 1. 功能测试(输入数组的数字大小无序;输入数组的数字单调递增;输入数组的数字单调递减); 2. 边界值测试(滑动窗口的大小为 0、1、等于输入数组的长度、大于输入数组的长度); 3. 特殊输入测试(输入数组为空)。
上一篇:
左旋转字符串
该分类下的相关小册推荐:
数据结构与算法(下)
算法面试通关 50 讲
业务开发实用算法精讲
编程之道-算法面试(下)
编程之道-算法面试(上)
数据结构与算法(上)
数据结构与算法之美