力扣 239.滑动窗口最大值

news/2025/2/9 4:22:18 标签: leetcode, 算法, 数据结构, java

思路

滑动窗口 + 遍历

解题思路

基本思路:使用滑动窗口法遍历数组,动态维护当前窗口的最大值。 特殊情况:该方法有一个缺陷,如果出窗口的元素是当前窗口的最大值max时,接下来的窗口中的最大值就无法确定了,所以就需要遍历新窗口,寻找其中的最大值。

复杂度

  • 时间复杂度: O(N * K)
  • 空间复杂度: O(N)

    代码实现:

    java">class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            int n = nums.length;
            int[] maxNum = new int[n - k + 1];
    
            int right = 0;     
            int max = nums[0]; //记录窗口的最大值
            int index = 0;     //记录最大值的下标
    
            //初始化窗口
            while(right < k){
                if(nums[right] >= max){
                    max = nums[right];
                    index = right;
                }
                right++;
            }
            maxNum[0] = max;
    
            //滑动窗口
            while(right < n){
                //如果入窗口的元素成为最大值则更新max和index
                if(nums[right] >= max){
                    max = nums[right];
                    index = right;
                }
    
                //如果出窗口的元素为最大值,则需要重新寻找当前窗口的最大值及下标
                if(right-k == index){
                    int[] newMax = findMax(nums,right-k+1,k);
                    max = newMax[0];
                    index = newMax[1];
                }
    
                maxNum[right - k + 1] = max;
                right++;
            }
            return maxNum;
        }
    
        //寻找当前窗口的最大值及其下标
        public int[] findMax(int[] nums, int start, int k){
            int[] max = new int[2];
            max[0] = nums[start];
            max[1] = start;
            for(int i = start + 1; i < start + k; i++){
                if(nums[i] >= max[0]){
                    max[0] = nums[i];
                    max[1] = i;
                }
            }
            return max;
        }
    }
    
    

    在我第一次写的时候直接就在每个窗口中加findMax函数无脑遍历,运行后发现超时,代码时间复杂度是 O(N * K)。随后按自己想法改了改代码,改成现在这个,最坏时间复杂度还是O(N * K),但是再一次运行发现可以通过。后面看了看官方题解,题解一的思路和我的大致一样但是用了优先级队列,运行速度方面能比自己的快,主要区别在于自己的findMax函数用遍历的方式找最大值及下标,优先级队列底层则用的堆,其复杂度为logN级别。


    http://www.niftyadmin.cn/n/5845507.html

    相关文章

    初始JavaEE篇 —— Spring Web MVC入门(下)

    找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 初始JavaEE篇 —— Spring Web MVC入门&#xff08;上&#xff09; 在上篇文章中&#xff0c;我们学习了一些注解的使用、Postman模…

    高阶C语言|和结构体与位段的邂逅之旅

    &#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C语言感兴…

    【慕伏白教程】Zerotier 连接与简单配置

    文章目录 下载与安装 WindowsLinux apt安装官方脚本安装 Zerotier 配置 新建网络网络配置 终端配置 WindowsLinux 下载与安装 Windows 进入Zerotier官方下载网站&#xff0c;点击下载 在下载目录找到安装文件&#xff0c;双击打开后点击 Install 开始安装 安装完成后&…

    Linux如何设置软件开机启动呢?

    有很多软件&#xff0c;我们安装完之后&#xff0c;服务器一旦重启&#xff0c;软件也需要我们手动再次启动&#xff0c;有很多的软件我们不想手动重启&#xff0c;例如Redis、Mysql、MQ等&#xff0c;那我们怎么配置软件跟着服务器也一起启动呢&#xff0c;今天就给大家带来软…

    Vue3中watch和watchEffect的使用场景和区别

    目录 watch 场景一&#xff1a;监听单个或多个特定数据的变化并执行副作用 场景二&#xff1a;监听多个数据源 watchEffect 场景一&#xff1a;自动追踪依赖并执行副作用 场景二&#xff1a;初始化时立即执行副作用 区别 监听方式 回调触发时机 响应式数据追踪方式 …

    c#中lock的经典示例

    lock 是 C# 中的一种用于同步线程执行的机制&#xff0c;它帮助确保多个线程在访问共享资源时不会发生冲突或数据损坏。其作用是通过给临界区&#xff08;即多线程访问共享资源的代码段&#xff09;加锁&#xff0c;使得在同一时刻只能有一个线程进入执行该代码段。 1、lock 的…

    第五十八章 Linux INPUT 子系统实验

    imx6ull-alientek-emmc.dts &#xff08;使用第四十九章的设备树文件即可&#xff09; keyinput.c #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/ide.h> #include <linux/init.h> #include…

    GitPuk快速安装配置教程(入门级)

    GitPuk是一款国产开源免费的代码管理工具&#xff0c;工具简洁易用&#xff0c;开源免费&#xff0c;本文将讲解如何快速安装和配置GitPuk&#xff0c;以快速入门上手。 1、安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Linux安装&#xfeff; 以下以Centos7安装…