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;
}