<!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>
<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>