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

来源:互联网 发布:优站目录源码 编辑:程序博客网 时间:2024/06/09 15:42
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>slideMaxWindow.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

<script type="text/javascript">

//采用双队列的方法,可以只需检查一遍,即可完成所有最大窗口的提取。时间复杂度为O(n).

/*解题思路:
 
 系统设置最大值和次大值,
1 窗口没有被填满时 ,只需把最大值赋给输出数组即可。
2 窗口被填满后 ,如果遇到最大值,则只需更新最大值,因为,前面的值不可能成为最大值,在接着的下一个值为次小值,并设立flag=1来标志。
     在遇到的值不是最大值时,如果最大值刚好超出范围,则只需比较新值和次小值,较大的为最大值;如果次大值出范围,不做处理;如果都不是,则只需比较新值和次大值,选择较大的为次大值,最后输出,即可
     

*/
var array=[2,3,4,2,6,2,5,1]; //输出4,4,6,6,6,5
//var array=[4,3,2,2,6,2,5,1];  //输出4,3,6,6,6,5
var slideWindow=3;//滑动窗口

function getMaxWindows(array,slideWindow){
    
    
    var max=0,lessMax=0; //记录存储的位置
    var flag=0;
    var result=new Array();//存储结果
    var length=array.length;//数组长度
    var i=0;
     /*窗口没有被填满时  start*/
     for(i=0;i<slideWindow&&i<length;i++){
        
         if(i==0){//max已经初始化
            
         }else if(i==1){
             if(array[1]>=array[0]){
                 max=1;
                 lessMax=0;
             }else{
                 lessMax=1;
                 max=0;
             }
         }else{ //i>1时
             if(array[i]>=array[max]){
                 lessMax=max;
                 max=i;
             }else if(array[i]>=array[lessMax]){
                 lessMax=i;
             }
            
         }
        
        }
    // alert(i);
     if(i>0){
         result[0]=array[max];
     }else{
         return result;
     }
      /*窗口没有被填满时  end*/
        
      /*窗口被填满后  start*/
      for(i=slideWindow;i<length;i++){
        if(array[i]>=array[max]){//新的值最大
            flag=1;
            max=i;
            
        }else{//新的值,不是最大
            if(flag==1){//上一个值是最大的
                lessMax=i;
                flag=0;
                
            }else{//上一个值不是最大的
                if(max==(i-slideWindow)){//最大值超范围
                    if(array[i]>=array[lessMax]){
                        max=i;
                    }else{
                        max=lessMax;
                        lessMax=i;
                    }
                    
                }else if(lessMax==(i-slideWindow)){
                    
                }else{//都没有超出范围
                    if(array[i]>=array[lessMax]){
                        lessMax=i;
                    }else{//不做处理
                        
                    }
                    
                }
                
            }
            
            
        }
          
          
        result[i-slideWindow+1]=array[max];
      }
      /*窗口被填满 后 end*/    
    
    
    return result;
};

function print(array){ //输出数组
    var length=array.length;//数组长度
    for(var i=0;i<length;i++){
        console.log("最大窗口值分别为="+array[i]);
    }
}
print(getMaxWindows(array,slideWindow));






</script>
  </head>
 
  <body>
    This is my HTML page. <br>
  </body>
</html>

1 0
原创粉丝点击