JZ59 滑动窗口的最大值
解题思路:
用4个变量来记录窗口的左右边界和 窗口内最大值位置,以及最大值
- 和最大值进行比较,如果大于等于 则进行替换,并更新最大值位置
- 遍历数组,当走到初始窗口右边界时,记录当前最大值。
- 左右窗口移动,
- 如果最大值位置不在窗口内,则需要重新在窗口内选出最大值及其位置
- 窗口右边界超过数组边界时,比较结束。
这样和暴力解法相比,节约了一部分比较选举最大值的时间
php 代码实现:
<?php
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param num int整型一维数组
* @param size int整型
* @return int整型一维数组
*/
function maxInWindows( $num , $size )
{
// write code here
$len = count($num);
if ($size == 0 || $size > $len) {
return null;
}
$windows = [];
$wHead = 0;
$wMaxPos = $wHead; // 最大值下标
$wMaxValue = $num[$wMaxPos]; //最大值
$wTail = $wHead+$size-1;
for ($i = 0 ; $i < $len; ) {
//如果最大值坐标 > $wHead 则只要和 当前最大值比较,如果不是,则需要从$wHead 到 $wTail
//找到一个新的最大值以及坐标
if ($wMaxPos >= $wHead ) {
//和当前窗口最大值比较
if ($num[$i] >= $wMaxValue) {
$wMaxValue = $num[$i];
$wMaxPos = $i;
}
} else {
$tmpPos = $wHead;
$wMaxPos = $wHead;
$wMaxValue = $num[$wMaxPos];
while(true){
if ($tmpPos > $wTail) {
break;
}
if ($num[$tmpPos] >= $wMaxValue) {
$wMaxPos = $tmpPos;
$wMaxValue = $num[$tmpPos];
}
$tmpPos++;
}
}
//窗口尾节点等于 数组尾节点时结束
if ($wTail > $len) {
break;
}
//从第一个窗口结束,开始记录最大窗口值
if ($i >= $wTail) {
$windows[] = $wMaxValue;
$wTail++;
$wHead++;
}
$i++;
}
return $windows;
}