zoukankan      html  css  js  c++  java
  • 剑指offer——滑动窗口的最大值

      给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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 import java.util.ArrayList;
     2 public class Solution {
     3     public ArrayList<Integer> maxInWindows(int [] num, int size)
     4     {
     5         ArrayList<Integer> list=new ArrayList<>();
     6         int max=Integer.MIN_VALUE;
     7         int maxindex=-1;
     8         if(size==0)
     9             return list;
    10         for(int i=0;i<num.length-size+1;i++){
    11             //判断是否在本次窗口内
    12             if(maxindex<i){
    13                 max=Integer.MIN_VALUE;
    14                 //遍历窗口,得到最大值
    15                 for(int j=i;j<i+size;j++){
    16                     if(num[j]>max){
    17                         //保存最大值
    18                         max=num[j];
    19                         //保存最大值的下标
    20                         maxindex=j;
    21                     }
    22                 }
    23             }else{
    24                 //窗口的最后一位数和旧最大值比较
    25                 if(num[i+size-1]>max){
    26                     max=num[i+size-1];
    27                     maxindex=i+size-1;
    28                 }
    29             }
    30             list.add(max);
    31         }
    32             return list;
    33     }
    34 }
  • 相关阅读:
    李开复给中国学生的第一封信
    vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
    高级程序员考试时间安排和参考书推荐
    vc++学习篇(四)—— 指针
    程序员应具备的素质
    Word 2003 长篇文档排版技巧(二)
    Google 技巧集锦
    给中国学生的第二封信
    修复mysql表
    社保相关
  • 原文地址:https://www.cnblogs.com/lyh28/p/10630354.html
Copyright © 2011-2022 走看看