`

Sliding Window Maximum

阅读更多
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

For example,
Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[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
Therefore, return the max sliding window as [3,3,5,5,6,7].

Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.

滑动窗口的题目,我们可以借助双向队列deque来解决。一边维护窗口的大小,一边将每个窗口的中的最大元素放在队列的头部,这样每次取队列的第一个元素就可以了。代码如下:
public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length == 0) return new int[0];
        int[] result = new int[nums.length - k + 1];
        Deque<Integer> deque = new LinkedList<Integer>();
        int index = 0;
        for(int i = 0; i < nums.length; i++) {
            //查看之前的最大元素是否在窗口中,如果不在就删除
            if(!deque.isEmpty() && (deque.getFirst() == (i - k)))
                deque.removeFirst();
            
            //添加新的元素到队尾
             while(!deque.isEmpty() && nums[deque.getLast()] <= nums[i]) 
                deque.removeLast();
            deque.addLast(i);  
            
            //将最大元素加入到结果中
            if(i >= k - 1) result[index ++] = nums[deque.getFirst()];
        }
        return result;
    }
}


如果不用队列也可以,思路是一样的,维护一个窗口,当窗口移动之后,检查之前窗口的最大元素是否在移动后的窗口中,如果在只需要比较最大元素与新近的元素就可以;如果不存在就在新窗口中找最大元素。代码如下:
public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length == 0) return new int[0];
        int[] result = new int[nums.length - k + 1];
        int maxIndex = 0;
        int max = Integer.MIN_VALUE;
        int index = 0;
        for(int i = 0; i < result.length; i++) {
            if(i == 0 || maxIndex == i - 1) {
                max = Integer.MIN_VALUE;
                for(int j = i; j < i + k; j++) 
                    if(nums[j] > max) {
                        max = nums[j];
                        maxIndex = j;
                    }
            }else {
                    if(nums[i + k - 1] > max) {
                        max = nums[i + k - 1];
                        maxIndex = i + k - 1;
                    }
                }
            result[index ++] = max;
        }
        return result;
    }
}
0
2
分享到:
评论

相关推荐

    alienxcn#ZXBlog#LintCode - 362. Sliding Window Maximum滑动窗口的最大值1

    再判断3位置上的2,由于比1大(也就是队列的尾部比这个数小),所以把队列尾部弹出一个,1弹出,由于4比2大,就可以放2了:再看窗口中减数的逻辑,当L向右移动的时

    slidingwindow.zip

    在Qt Designer中,选择子窗口,然后在“属性编辑器”中设置“minimumSize”和“maximumSize”。 **编写代码** 1. 在`.cpp`文件中,我们将处理QSplitter的信号和槽。例如,可以创建一个槽函数,当QSplitter的分割线...

    c语言-leetcode题解之0239-sliding-window-maximum

    c c语言_leetcode题解之0239_sliding_window_maximum

    算法面试通关40讲完整课件 11-13 优先队列(PriorityQueue)

    - 滑动窗口最大值:在滑动窗口内维护一个最大值,如LeetCode题目《Sliding Window Maximum》。 - Dijkstra最短路径算法:用于寻找图中节点间的最短路径。 - Huffman编码:在数据压缩中构建最优的Huffman树。 5. ...

    Thesis2013-浅谈数据结构题的几个非经典解法1

    8. **滑动窗口最大值(Sliding Window Maximum)**:在数组中找到连续子数组的最大值,可以使用单调栈或双端队列(deque)等数据结构实现。 9. **数据结构优化**:文中提到了利用splay tree(自平衡搜索树)优化...

    春节7天练丨Day2:栈、队列和递归1

    2. **Sliding Window Maximum**:找到数组中每个滑动窗口的最大值,可以使用队列来快速找到每个窗口的最大值。 ### 递归 递归是一种解决问题的方法,它通过调用自身来解决问题。递归通常用于解决树形结构的问题、...

    leetcode代码200题c++

    5. **Sliding Window Maximum**:这是一个滑动窗口最大值问题,要求在不断移动窗口时,找到每个窗口内的最大值。可以使用单调栈或双端队列(deque)来解决。 6. **Factorial Trailing Zeroes**:该问题涉及到数学...

    lrucacheleetcode-leetcode:leetcode

    Maximum 255. Verify Preorder Sequence in Binary Search Tree 907. Sum of Subarray Minimums 二叉搜索树 99. Recover Binary Search Tree 109. Convert Sorted List to Binary Search Tree 116. Populating Next ...

    百度之星试题A+答案

    1. **滑动窗口最大值(Sliding Window Maximum)**:可以使用滑动窗口最大值数据结构来快速找到度度熊能够消灭的僵尸血量范围。 2. **二分查找(Binary Search)**:通过二分查找在可能的血量范围内找到第k小的血量值,...

    leetcode信封-LeetCode:LeetCode解题

    leetcode信封 LeetCode LeetCode解题 源码目录 //main下为源码,test下为单元测试 │ src │ ├─main │ └─java │ └─com │ └─algorithm │ GeneratorParenthesis.java //22. ...Sliding Window Maximum

    LeetCode最全代码

    318| [Maximum Product of Word Lengths](https://leetcode.com/problems/maximum-product-of-word-lengths/) | [C++](./C++/maximum-product-of-word-lengths.cpp) [Python](./Python/maximum-product-of-word-...

    leetcode卡-leetcode_practices_learncard_hashtable:我的leetcode哈希表学习卡实践

    6. **滑动窗口最大值/最小值**:“滑动窗口最大值”(Sliding Window Maximum),使用双端队列和哈希表可以高效地找到每个窗口内的最大值。 7. **组合优化问题**:如“组合总和”(Combination Sum),哈希表可以...

    leetcode_blog

    而“Sliding Window Maximum”问题则需要我们理解队列的特性,找出数组中每个固定窗口大小的最大值。 二叉树问题在LeetCode中占据了相当大的比重,如“Binary Tree Inorder Traversal”要求中序遍历二叉树。学习...

    Leetcode

    例如,"滑动窗口最大值"(Sliding Window Maximum)需要找出数组中每个指定宽度窗口的最大值。 5. **哈希表**:哈希表提供了快速查找功能,常见于解决查找、计数、去重等问题。"两数之和"(Two Sum)也可以用哈希表...

    Leetcode-practice

    LeetCode中的回溯法(Backtracking)和滑动窗口最大值(Sliding Window Maximum)等题目的解决方案常涉及栈和队列。 4. 哈希表:哈希表是一种通过键值对进行高效查找的数据结构。Java中的HashMap类提供了快速的插入...

    计算机网络计算吞吐量习题 .doc

    滑动窗口线路利用率公式(Sliding Window Line Utilization Formula)是一种计算信道利用率的方法。该公式为: U = W / (2a + 1) 其中,U 是信道利用率,W 是窗口大小,a 是往返时延。在本题中,W = 1,a = 19.07...

    Juanji.rar_The Call

    4. **滑动窗口(Sliding Window)**:在解码过程中,考虑到当前时刻和一定历史范围内的信息,进行最优路径搜索。 5. **最大后验概率(Maximum A Posteriori, MAP)**和**最大似然(Maximum Likelihood, ML)**原则:...

    leetcode双人赛-LeetCode:力码

    Sliding Window,滑动窗口类型 滑动窗口类型的题目经常是用来执行数组或是链表上某个区间(窗口)上的操作。比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边一个一个元素挪动。当然了,...

    信息论基础(英文版)

    13.4.1 Sliding Window Lempel–Ziv Algorithm 441 13.4.2 Tree-Structured Lempel–Ziv Algorithms 442 13.5 Optimality of Lempel–Ziv Algorithms 443 13.5.1 Sliding Window Lempel–Ziv Algorithms 443 13.5.2 ...

    algorithm-homework

    作业说明 代码注释中有力扣链接. ...滑动窗口最大值, sliding-window-maximum.ts 两两交换链表中的节点, swap-nodes-in-pairs.ts 三数之和, three-sum.ts 接雨水, trapping-rain-water.ts 两数之和,

Global site tag (gtag.js) - Google Analytics