当前位置: 首页 > news >正文

Leetcode——239. 滑动窗口最大值

题解一

思路

第一次做困难的题,确实把我既困住了又难住了,确实自己一点都想不出来。

这个思路,差不多就是,自己定义一个单调队列。

添加的时候,判断是否比队列最后的元素大,如果比它大,就把末尾的元素弹出,保证队列里从队头到队尾是单调递减的,这样的话,peek()方法调出的元素,就永远是滑动窗口里最大的元素;删除元素的时候,因为有些元素有可能在还没删除的时候就已经被删掉了,所以说要判断被删的元素是不是在单调队列里(这也是我后面暴力解的时候,没解决的问题),如果在队列里就把他删掉,由队列里第二大的元素变成队头。peek()方法调用的依旧是滑动窗口里最大的元素。

代码

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        if(k == 1){
            return nums;
        }

        int length = nums.length;
        MyQueue myQueue = new MyQueue();
        int[] maxNums = new int [length - k + 1];

        for(int i = 0; i < k; i++){
            myQueue.offer(nums[i]);
        }

        maxNums[0] = myQueue.peek();
        int index = 1;

        for(int i = k; i < length; i++){
            myQueue.offer(nums[i]);
            myQueue.poll(nums[i - k]);

            maxNums[index++] = myQueue.peek();
        }
        return maxNums;
    }
}
class MyQueue{
    Deque<Integer> queue = new ArrayDeque<>();
    
    public void offer(int val){
        while(!queue.isEmpty() && val > queue.getLast()){
            queue.removeLast();
        }
        queue.offer(val);
    }

    public void poll(int val){
        if(!queue.isEmpty() && val == queue.peek()){
            queue.poll();
        }
    }

    public int peek(){
        return queue.peek();
    }
}

 总结

不愧是困难的题,确实想不出来。但是掌握单调队列这个解题思路,以及getLast()方法,还有removeLast()方法。

题解二

思路

暴力解思路就很简单了,每次有元素的替换的时候就遍历下数组里的元素,看看哪个最大

ps:但是这道题是困难,因此有几个用例会超时,所以并不算严格意义上的题解。

代码

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        int length = nums.length;

        if(k == 1){
            return nums;
        }

        if(k == length){
            int max = 0;
            for(int i : nums){
                if(i > max){
                    max = i;
                }
            }
            return new int[]{max};
        }

        int maxNums[] = new int [length - k + 1];
        int max = 0;
        int left = 0;
        int right = 0;
        int index = 0;

        while(right < length){
            if(right - left < k - 1){
                right++;
            }
            else if(right - left == k - 1){
                int max2 = nums[left];
                for(int i = left; i <= right; i++){
                    if(nums[i] > max2){
                        max2 = nums[i];
                    }
                }
                maxNums[index++] = max2;
                left++;
            }
        }
        return maxNums;
    }
}
http://www.dtcms.com/a/112577.html

相关文章:

  • C语言的操作系统
  • TypeScript 类 vs. ES6 类:深入对比与最佳实践
  • Logo语言的系统监控
  • 【idea设置文件头模板】
  • 07-MySQL-事务的隔离级别以及底层原理
  • 多模态情感分析的张量融合网络(Tensor Fusion Network):原理、实践与代码实现
  • 游戏引擎学习第203天
  • Cortex-M系列MCU的位带操作
  • python 命名空间与作用域 可变与不可变对象 闭包
  • Haskell语言的NoSQL
  • 国产MCU替代STM32全解析:主流方案对比与实战指南
  • 11-leveldb compact原理和性能优化
  • 洛谷题单2-P5715 【深基3.例8】三位数排序-python-流程图重构
  • C 语言内存管理:从基础到实践
  • 《用代码实现字符数组的动态填充与显示》
  • 每日一题(小白)模拟娱乐篇13
  • Java基础-设计模式详解
  • 理解“功能内聚”
  • 如何在CSS中创建从左上角到右下角的渐变边框
  • SpringBoot + Netty + Vue + WebSocket实现在线聊天
  • @progress/kendo-react-dropdowns <ComboBox>组件报错,解决
  • 前端加密方式 AES对称加密 RSA非对称加密 以及 MD5哈希算法详解
  • 记录 vue-router访问 / 路径直接重定向到有权限的第一个菜单
  • 企业应用集成全析:架构、实践与展望
  • Mysql 中 MyISAM vs InnoDB
  • windows技术基础知识
  • 14.mybatis源码解析
  • 使用MCP服务器实现AI任务完成通知:让Cursor更智能
  • Floyd 算法 Java
  • Go/Rust 疯狂蚕食 Java 市场?老牌语言的 AI 化自救之路