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

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

时间:2023-04-26 09:46:55浏览次数:32  
标签:59 nums int 最大值 Offer new 滑动 窗口

【题目】

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例:

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

 

提示:

你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length。

注意:本题与主站 239 题相同:https://leetcode-cn.com/problems/sliding-window-maximum/

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof

【思想】

使用一个单调队列,只会保存长度为k的,单调递减的数,同时可以保证最大的那个数出队,如果遇到比最大的数还大的,那么之前的数全部出队。

 

【代码】

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length==0||k==0){
            return new int[0];
        }
        Deque<Integer> deq = new LinkedList<>();
        int[] res = new int[nums.length-k+1];
        // 初始化队列,找到前k个数可以形成单调队列的数
        for(int i=0;i<k;i++){
            while(!deq.isEmpty()&&deq.peekLast()<nums[i]){
                deq.removeLast();
            }
            deq.addLast(nums[i]);
        }
        res[0] = deq.peekFirst();
        // 从第k个数开始,遍历数组
        for(int i=k;i<nums.length;i++){
            //如果遇到了当前最大数 就将最大数出队
            if(deq.peekFirst()==nums[i-k]){
                deq.removeFirst();
            }
            // 如果遇到不单调递减的情况,先将小的数出队
             while(!deq.isEmpty()&&deq.peekLast()<nums[i]){
                deq.removeLast();
            }
            // 加入当前遍历的数
            deq.addLast(nums[i]);
            // 更新结果列表
            res[i-k+1] = deq.peekFirst();
        }
        return res;
    }
}

 

标签:59,nums,int,最大值,Offer,new,滑动,窗口
From: https://www.cnblogs.com/End1ess/p/17354704.html

相关文章

  • NC20259 [SCOI2007]降雨量
    题目链接题目题目描述我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自......
  • 剑指 Offer II 017. 含有所有字符的最短字符串
    题目链接:剑指OfferII017.含有所有字符的最短字符串方法:同向双指针解题思路基本思路:统计\(t\)字符串中每个字符的个数,然后使用双指针遍历字符串\(s\),当窗口覆盖\(t\)中所有字符时,开始缩短左指针到可以到达的最右侧,取窗口最小的字符串为答案;需要考虑的问题:什么情况......
  • java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值
    点击查看代码importorg.junit.Test;importjava.text.SimpleDateFormat;importjava.util.*;importjava.util.stream.Collectors;importstaticjava.util.Comparator.comparingLong;importstaticjava.util.stream.Collectors.*;/***@Author:*@Date:2018/12......
  • 分治算法:剑指 Offer 25. 合并两个排序的链表
    题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 限制:0<=链表长度<=1000 解题思路:    classSolution{publicListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedum=newListNode......
  • 剑指 Offer 55 - II. 平衡二叉树
    剑指Offer55-II.平衡二叉树输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例1:给定二叉树[3,9,20,null,null,15,7]3/\920/\157返回true。示例2:......
  • 剑指 Offer 10- II. 青蛙跳台阶问题
    分析:因为好久没有练习思维还没有转变,所以这道题思考有点慢首先还是建立状态,到达第i级台阶时,有f[i]种跳法最后答案f[n-1]再状态转移,f[i]=f[i-1]+f[i-2] 赋初值,因为可以选择跳一阶或者两阶,所以初始赋值f[0]和f[1],f[0]=1,f[1]=2然后编写代码,但是最后有个问题,不知道1e9+7不是......
  • 剑指 Offer II 088. 爬楼梯的最少成本
    剑指OfferII088.爬楼梯的最少成本-力扣(LeetCode)分析:先思考建立状态。到达第i阶台阶时,花费最少体力为f[i]。再状态转移,到达i时有两种选择,从i-1或者i-2到i,两者取最小的再加上i需要花费的体力cost[i]。结果f[-1]最后得出状态转移:f[i]=min(f[i-1],f[i-1])+cost[i]......
  • Codeforces Round #459 (Div. 2) D. MADMAX DAG&&博弈
    Asweallknow,Maxisthebestvideogameplayeramongherfriends.Herfriendsweresojealousofhers,thattheycreatedanactualgamejusttoprovethatshe’snotthebestatgames.Thegameisplayedonadirectedacyclicgraph(aDAG)withnvertic......
  • cuda编程 转载https://zhuanlan.zhihu.com/p/592721411
     4.相关概念和术语在CUDA编程模型中,两个主要的硬件设备分别为CPU和GPU,它们都有自己专用的内存区域。I主机、设备和异构并行编程CPU连同它的计算机RAM被称为主机(Host)。CPU由于其结构特点非常适合运行串行程序。但CPU的问题是,如果其运行至一部分需要大规模并行运算的代码时,......
  • mysql求多列最大值
    1、使用列转行,每一列都转为一行数据,这样,直接比值就可以了。优点:比较常用,可以不用先求出每行或每列的最大值,转换后直接比值即可。缺点:大量使用union,union越多,性能越差,在数据量大的情况下不推荐。selectymd,max(value)from( selectname,oneasvaluefromt unionall s......