首页 > 其他分享 >剑指 Offer 59 - I. 滑动窗口的最大值

剑指 Offer 59 - I. 滑动窗口的最大值

时间:2023-09-03 21:37:55浏览次数:45  
标签:59 nums int max 最大值 Offer queue offer res


剑指 Offer 59 - I. 滑动窗口的最大值

单调队列
在增删元素的过程中要求能返回当前最大元素,和 155. 最小栈 类似。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length, p = 0;
        int[] res = new int[n - k + 1];
        MyQueue queue = new MyQueue();

        for(int i = 0; i < k - 1; i++) queue.offer(nums[i]);
        for(int i = k - 1; i < n; i++){
            queue.offer(nums[i]);
            res[p++] = queue.getMax();
            queue.poll(nums[i - k + 1]);
        }

        return res;
    }
}

class MyQueue{
    Deque<Integer> q_max = new ArrayDeque<>();;

    public void offer(int x){
        while(!q_max.isEmpty() && q_max.peekLast() < x){
            q_max.pollLast();
        }
        q_max.offerLast(x);
    }

    public void poll(int x){
        if(x == q_max.peekFirst()){
            q_max.pollFirst();
        }
    }

    public int getMax(){
        return q_max.peekFirst();
    }
}

结果用 List 转为数组,不用计算元素个数。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        List<Integer> res = new ArrayList<>();
        MyQueue queue = new MyQueue();

        for(int i = 0; i < k - 1; i++) queue.offer(nums[i]);
        for(int i = k - 1; i < n; i++){
            queue.offer(nums[i]);
            res.add(queue.getMax());
            queue.poll(nums[i - k + 1]);
        }

        return res.stream().mapToInt(x -> x).toArray();
    }
}


标签:59,nums,int,max,最大值,Offer,queue,offer,res
From: https://blog.51cto.com/u_16208057/7343319

相关文章

  • 剑指 Offer 59 - II. 队列的最大值
    剑指Offer59-II.队列的最大值就是题目剑指Offer59-I.滑动窗口的最大值需要实现的数据结构。一个队列用于正常加入和删除数据,另一个队列用于维护最大值。classMaxQueue{Deque<Integer>q=newArrayDeque<>();Deque<Integer>q_max=newArrayDeque<>();......
  • 剑指 Offer 58 - II. 左旋转字符串
    剑指Offer58-II.左旋转字符串翻转前n个字符翻转其余字符翻转所有字符classSolution{publicStringreverseLeftWords(Strings,intn){char[]ch=s.toCharArray();reverse(ch,0,n-1);reverse(ch,n,ch.length-1);rever......
  • 剑指 Offer 64. 求1+2+…+n
    剑指Offer64.求1+2+…+n使用逻辑运算符的短路效应代替终止条件。classSolution{intres=0;publicintsumNums(intn){booleanx=n>1&&sumNums(n-1)>0;res+=n;returnres;}}......
  • 剑指 Offer 60. n个骰子的点数
    剑指Offer60.n个骰子的点数动态规划:已知n-1个骰子的所有情况,再增加一个骰子,可推出n个骰子的所有情况。增加的一个骰子的点数只有1-6种可能,与n-1个骰子对应点数相乘,可得到n个骰子点数的一种情况,遍历所有情况即可。classSolution{publicdouble[]dicesProbability(intn)......
  • 剑指 Offer 06. 从尾到头打印链表
    剑指Offer06.从尾到头打印链表方法一顺序添加,再翻转。classSolution{publicint[]reversePrint(ListNodehead){ListNodeh=head;List<Integer>res=newArrayList<>();while(h!=null){res.add(h.val);h=......
  • 剑指 Offer 03. 数组中重复的数字
    剑指Offer03.数组中重复的数字利用题目的限制条件:所有数字都在0~n-1的范围内通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。classSolution{publicintfindRepeatNumber(int[]nums){intn=nums.length;inti=0;......
  • 剑指 Offer 62. 圆圈中最后剩下的数字(简单)
    题目:classSolution{public:intlastRemaining(intn,intm){intpos=0;for(inti=2;i<=n;i++){pos=(pos+m)%i;}returnpos;}};作者:想吃火锅的木易链接:https://leetcode.cn/problems/yuan-quan-zhong-z......
  • 剑指offer_20230803
    剑指Offer51.数组中的逆序对题目说明在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路1:暴力肯定是可行但是会超时的,就不用考虑了,但理论可行解题思路2:归并可以利用归并排序时的一个特性......
  • 剑指 Offer 57 - II. 和为s的连续正数序列(简单)
    题目:classSolution{public:vector<vector<int>>findContinuousSequence(inttarget){//本题使用滑动窗口(双指针)inti=1,j=1;//定义左右边界,一般是左闭右开intsum=0;//窗口内的和vector<vector<int>>result;whi......
  • openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍
    openGauss学习笔记-59openGauss数据库管理-相关概念介绍59.1数据库数据库用于管理各类数据对象,与其他数据库隔离。创建数据对象时可以指定对应的表空间,如果不指定相应的表空间,相关的对象会默认保存在PG_DEFAULT空间中。数据库管理的对象可分布在多个表空间上。59.2表空间在......