首页 > 其他分享 >11_滑动窗口最大值

11_滑动窗口最大值

时间:2023-10-17 10:02:23浏览次数:29  
标签:11 窗口 nums 队列 最大值 元素 int 滑动

滑动窗口最大值

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

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

示例 1:

输入: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

示例 2:

输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

【思路】

需要设计单调队列,维护元素配合窗口进行滑动。

设计单调队列的时候,pop和push操作要保持如下规则:

1.pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作

2.push(value):如push的元素value大于入口元素的值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止

保持如上规则,每次窗口移动的时候,只要访问queue.front()就可以返回当前窗口的最大值。

// 滑动窗口的最大值
//解法一
//自定义数组
class MyQueue {
    Deque<Integer> deque = new LinkedList<>();
    // 弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    // 同时要判断队列当前是否为空
    void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }

    // 添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    // 保证队列元素单调递减
    // 比如此时队列元素3,1, 2将要入队,比1大,所以1弹出,此时队列:3,2
    void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }
    // 队列对顶元素始终为最大值
    int peek() {
        return deque.peek();
    }
}

public class MaxSlidingWindow {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 1) {
            return nums;
        }
        // 最终返回的窗口最大值的长度
        int len = nums.length - k + 1;
        // 存放结果元素的数组
        int[] res = new int[len];
        int num = 0;
        // 自定义队列
        MyQueue myQueue = new MyQueue();
        // 先将前k的元素放入队列
        for (int i = 0; i < k; i++) {
            myQueue.add(nums[i]);
        }
        res[num++] = myQueue.peek();
        for (int i = k; i < nums.length; i++) {
            // 滑动窗口移除最前面的元素,移除是判断该元素是够放入队列
            myQueue.poll(nums[i - k]);
            // 滑动窗口加入最后面的元素
            myQueue.add(nums[i]);
            // 记录对应的最大值
            res[num++] = myQueue.peek();
        }
        return res;
    }
}

标签:11,窗口,nums,队列,最大值,元素,int,滑动
From: https://www.cnblogs.com/codingbao/p/17769015.html

相关文章

  • 珍惜免费升级Win11机会!微软宣布放弃Windows 10时间:还有2年
    对于微软来说,不升级Windows11的用户,就是最大的阻碍,如果你还坚守Windows10,那么不好意思了。Windows10支持将于2025年10月14日结束,用户正好有两年时间升级硬件并安装Windows11。整整两年后(距今730天),微软将发布Windows10家庭版和专业版的最后一次安全更新。这意味着Windows......
  • C++11手写线程池1
    线程池结构  任务队列结构体 保存一个回调函数指针和一个,参数指针 实现任务队列 为了多个生产者多个消费者取东西混乱的避免要加互斥锁线程池threadpool类要实现的初始化一个线城池参数是最小数和最大数   malloc和new的区别new要调用该类的构......
  • CF1168C And Reachability
    CF1168CAndReachabilityAndReachability-洛谷|计算机科学教育新生态(luogu.com.cn)目录CF1168CAndReachability题目大意思路code题目大意给定一个长度为\(n\)的数组\(a\)。你可以选择一个长度为\(k\)的数组\(p\)\(p_1=x,p_k=y\)当\(x<y\)且\(a_......
  • CF1168C
    CF1168C题面及数据范围Ps:链接为洛谷OJ。发现对于每一个\(i\)需要求经过若干次转移使第\(j\)个二进制位为\(1\)的最近位置\(k\),查询时,当\(k\leqy\)便可以到达。下文的位无特殊说明位均指二进制位。设\(f[i][j]\)为\(i\)经过转移使第\(j\)位为\(1\)的最近点......
  • CF1119F Niyaz and Small Degrees 题解
    原题翻译首先\(O(n^2\logn)\)的dp是simple的,我们设\(dp_{i,0/1}\)表示以\(i\)为根,\(i\)到\(fa_i\)这条边删/不删的最小权值和。转移是一个非常trick的问题,只需要假设所有都选\(dp_{i,0}\),然后把所有儿子按照\(dp_{v,1}+w(u,v)-dp_{v,0}\)排序,选前\(d......
  • 文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
    七、用go语言,给出一个O(n)时间的非递归过程,实现对一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。文心一言:在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:t......
  • 文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
    七、用go语言,给出一个O(n)时间的非递归过程,实现对一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。文心一言:在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:type......
  • 模拟赛 (11~20)
    一、高一高二联合NOIP模拟赛11T1:运输(transport)方差最小代表什么?设\(\sum_{i=1}^{n}a_i=sum\).最理想的情况是所有结点最终的\(a_i\)都变成\(s=\lfloor{sum\overn}\rfloor\).但是有可能\(n\)不能整除\(sum\)。设\(las=sum\modn\)。那么问题转化成有\(......
  • 11 事件处理
    <template><!--内联事件处理器,很少用--><h3>内联事件处理器</h3><buttonv-on:click="count++">内联事件处理器</button><p>{{count}}</p><!--方法事件处理器,常用--><h3>方法事件处理器</h3><button@click=&qu......
  • 11el
    #include<stdio.h>#include <sys/types.h>#include <dirent.h>voiddo_ls(char[]);intmain(intargc,char*argv[]){ if(argc==1) do_ls("."); else while(--argc){ printf("%s:\n",*++argv); do_ls(*argv)......