leetcode1299(将每个元素替换为右侧最大元素)--Java语言实现

江枫思渺然 提交于 2020-10-03 05:26:30

求:

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。

完成所有替换操作后,请你返回这个数组。

 

示例:

输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
 

提示:

1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5

 

题目链接: https://leetcode-cn.com/problems/replace-elements-with-greatest-element-on-right-side/

 

解:

1、反向遍历

本题的核心在反向遍历,因为每次是要用右侧所有元素的最大值来覆盖当前遍历到的元素,进行逆向遍历,可以重复利用上一次的比较结果。达到最优的时间复杂度。我们使用一个数组ret来保存每次遍历遍历得到的最大值,ret[arr.length-1]的位置,根据题目要求,初始化为-1。最后返回ret。

时间复杂度:O(N)

空间复杂度:O(N)

public int[] replaceElements(int[] arr) {
    int N = arr.length;
    int ret[] = new int[N];
    ret[N - 1] = -1;
    int max = arr[N - 1];
    for (int i = N - 2; i >= 0; i--) {
        ret[i] = max;
        max = Math.max(max, arr[i]);
    }
    return ret;
}

2、反向遍历+原地更新

时间复杂度:O(N)

空间复杂度:O(1)

使用一个rightMax记录右侧的最大值,rightMax初始化为-1。然后在从右往左遍历的过程中,先将arr[i]保存到临时变量temp,同时将arr[i]更新为rightMax,再将rightMax更新为rightMax和temp中的较大者(这个时候arr[i]已经被更新过了,不是原来的值,所以需要一个temp),直到遍历到数组的第一个元素,返回数组。

public int[] replaceElements(int[] arr) {
    int N = arr.length;
    int rightMax = -1;
    for (int i = N - 1; i >= 0; i--) {
        int temp = arr[i];
        arr[i] = rightMax;
        rightMax = Math.max(rightMax,temp);
    }
    return arr;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!