PHP——将每个元素替换为右侧最大元素

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值