leecode上看到的一道题
给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
完成所有替换操作后,请你返回这个数组。
示例:
输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
第一种解法:php内置函数
function replaceElements($arr) {
$newarr = array();
for ($i=0;$i<count($arr);$i++) {
$end = max(array_slice($arr,$i+1));
$newarr [$i] = $end==false?'-1':$end;
}
return $newarr;
}
这个方法耗时很长,主要是方便……
第二种,从左往右依次对比,两个循环,时间复杂度O(N^2)
function replaceElements($arr) {
for ($i=0;$i<count($arr);$i++) {
$max = -1;
for($j=$i+1;$j<count($arr);$j++) {
if ($max<$arr [$j]) {
$max = $arr[$j];
}
}
$arr [$i] = $max;
}
return $arr;
}
好不到哪去,毕竟是2个循环,不过比内置函数好多了,毕竟内置函数底层也那么多的循环
第三种,从右往左,一个循环 时间复杂度 O(1)
1.先将最后一个元素设为当前最大值
2.从倒数第二个元素开始遍历,首先先将当前元素保存到零时变量temp
3.将当前位置修改为当前最大值
4.比较如果temp大于当前保存的最大值,则修改当前最大值为temp
5.遍历完成为修改最后一个元素为-1
(minsheng)
function replaceElements($arr) {
$max = -1;// 当前最大值
for ($i=count($arr)-1;$i>-1;$i--) {
$temp = $arr[$i];
$arr [$i] = $max;
if ($temp>$max) {
$max = $temp;
}
}
return $arr;
}