《剑指offer》—— 64. 滑动窗口的最大值(Java)

推荐

完整《剑指Offer》算法题解析系列请点击 👉 《剑指Offer》全解析 Java 版

题目描述

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

public class Solution {
   
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
   
        
    }
}

**参考思路:**最大堆

  1. 先排除一下特殊情况。
  2. 构建一个最大堆。
  3. 将数组中的 0~size 存入最大堆中,并将堆顶元素存入结果集合中。
  4. 固定最大堆的大小为 size, 每次移除最大堆中上一次存入的元素,并存入下一个元素,然后每次将堆顶元素存入到集合中。
  5. 遍历完数组之后,输出最终结果。

参考实现:

import java.util.*;
public class Solution {
   
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
   
        //创建一个存储结果的集合
        ArrayList<Integer> result = new ArrayList<>();
        //如果滑动窗口长度大于数组长度或者小于1,直接输出空的result。
        if (size > num.length || size < 1) {
   
            return result;
        }
        //构建一个大顶堆
        PriorityQueue<Integer> heap = new PriorityQueue<>((o1,o2) -> o2 - o1);
        
        //将初始窗口中的值加到大顶堆汇中去
        for (int i = 0; i < size; i++) {
   
            heap.add(num[i]);
        }
        //将大顶堆中的堆顶元素存入到result结果中,也就是第一个窗口中的最大值
        result.add(heap.peek());
        //将最大堆的大小固定为size,每次将前一个元素移除,将后一个元素添加进去,然后将每次的堆顶元素添加到result结果中。
        for(int i = 0, j = i + size; j < num.length; i++,j++) {
   
            heap.remove(num[i]);
            heap.add(num[j]);
            result.add(heap.peek());
        }
        //返回最终结果
        return result;
    }
}

看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。

这里是猿兄,为你分享程序员的世界。

非常感谢各位大佬们能看到这里,如果觉得文章还不错的话, 求点赞👍 求关注💗 求分享👬求评论📝 这些对猿兄来说真的 非常有用!!!

注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!

全部评论

相关推荐

迟缓的斜杠青年巴比Q...:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务