本文介绍: 大家好我是苏麟 , 今天带来一道小题 .

大家好我是苏麟 , 今天带来一道小题 .

滑动窗口最大值

描述 :

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

返回 滑动窗口中的最大值 

题目 :

LeetCode 239.滑动窗口最大值 :

239. 滑动窗口最大值

分析 :

这种方法我们在基础算法的堆部分介绍过。对于最大值、K个最大这种场景优先队列(堆)是首先应该考虑思路。大根堆可以帮助我们实时维护系列元素中的最大值。

本题初始时,我们将数组 nums 的前 k元素放入优先队列中。每当我们右移窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶元素就是堆中所有元素最大值。然而这个最大可能不在滑动窗口中,在这种情况下,这个值在数组 nums 中的位置出现在滑动窗口边界的左侧。因此,当我们后续继续向右移动窗口时,这个值就永远不可出现在滑动窗口中了,我们可以将其永久地从优先队列移除

我们不断地移除堆顶元素,直到其确实出现在滑动窗口中。此时,堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列存储元组(numindex),表示元素num 在数组中的下标index

解析 :

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        PriorityQueue&lt;int[]&gt; pq = new PriorityQueue<>(new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return a[0] != b[0] ? b[0] - a[0] : b[1] - a[1];
            }

        });
        for(int i = 0;i< k; i++){
            pq.offer(new int[]{nums[i],i});
        }
        int[] arr = new int[n - k + 1];
        arr[0] = pq.peek()[0];
        for(int i= k;i < n;i++){
            pq.offer(new int[]{nums[i],i});
            while(pq.peek()[1] <= i - k){
                pq.poll();
            }
            arr[i - k + 1] = pq.peek()[0];
        }
        return arr;
    }
}

这期就到这里 , 下期见!

原文地址:https://blog.csdn.net/sytdsqzr/article/details/134790608

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43726.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注