• 判断滑动窗口中的最大值


    问题:

      给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。

    分析:

      (1)建立滑动窗口,并初始化化。

      (2)动态更新窗口值:因为窗口是每一次只移动一位,所以每次只需要更新窗口内部指定的一位。计算当前更新值的位置:i %size,刚好等于每次需要被淘汰的值。

    code:

     1  public ArrayList<Integer> maxInWindows(int [] num, int size) {
     2         ArrayList<Integer> list = new ArrayList<>();
     3         if(num==null || num.length==0){
     4             return list;
     5         }else if(size>=num.length){
     6             OptionalInt max = Arrays.stream(num).max();
     7             list.add(max.getAsInt());
     8             return list;
     9         }else{
    10             int[] dp = new int[size];   //建立滑动窗口
    11             //初始化滑动窗口
    12             System.arraycopy(num,0,dp,0,size);
    13             OptionalInt max = Arrays.stream(dp).max();
    14             list.add(max.getAsInt());
    15             //窗口移动
    16             for(int i=size;i<num.length;i++){
    17                 dp[i%size] = num[i]; //更新窗口
    18                 max = Arrays.stream(dp).max();  //使用流获取最大值
    19                 list.add(max.getAsInt());
    20             }
    21             return list;
    22         }
    23 
    24 
    25     }
  • 相关阅读:
    ✨Synchronized底层实现---偏向锁
    🌞LCP 13. 寻宝
    ✨Synchronized底层实现---概述
    ⛅104. 二叉树的最大深度
    c++多线程之顺序调用类成员函数
    C++ STL实现总结
    C#小知识
    C#中HashTable和Dictionary的区别
    WPF的静态资源(StaticResource)和动态资源(DynamicResource)
    WPF之再谈MVVM
  • 原文地址:https://www.cnblogs.com/dream-flying/p/12931710.html
Copyright © 2020-2023  润新知