1299. 将每个元素替换为右侧最大元素

120 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
  • 完成所有替换操作后,请你返回这个数组。

示例

  • 示例 1:

    • 输入: arr = [17,18,5,4,6,1]
    • 输出: [18,6,6,6,1,-1]
    • 解释:
      • 下标 0 的元素 --> 右侧最大元素是下标 1 的元素 (18)
      • 下标 1 的元素 --> 右侧最大元素是下标 4 的元素 (6)
      • 下标 2 的元素 --> 右侧最大元素是下标 4 的元素 (6)
      • 下标 3 的元素 --> 右侧最大元素是下标 4 的元素 (6)
      • 下标 4 的元素 --> 右侧最大元素是下标 5 的元素 (1)
      • 下标 5 的元素 --> 右侧没有其他元素,替换为 -1
  • 示例 2:

    • 输入: arr = [400]
    • 输出: [-1]
    • 解释: 下标 0 的元素右侧没有其他元素。

提示

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

代码

function replaceElements(arr: number[]): number[] {
    if(arr.length === 1) return [-1];
    let result = [];
    for(let i = 0; i < arr.length; i++){
        let max = 0;
        if(i < arr.length - 1){
            for(let k = i + 1; k < arr.length; k++){
                max = Math.max(max, arr[k]);
            }
            result.push(max);
        } else {
            max = -1;
            result.push(max);
        }
    }
    return result
};
  • 双重遍历,找出最大值
    • 边界处理:数组arr长度的取值范围包括1,所以当数组长度等于1时,元素右边没有其他元素,只能返回[-1]
    • 当数组长度大于1时,首先定义一个保存替换后结果的数组变量
    • 然后双重遍历该数组,外层遍历确定当前需要替换的位置,内存遍历找出当前替换位置元素右边的所有元素的最大值
    • 下一步将找出的最大值添加到结果变量中
    • tips:如果当前元素是数组的最后一位元素时,此时不需要找右边的最大值,因为右边没有元素了,直接push(-1)即可
    • 最后返回替换后的数组结果
function replaceElements(arr: number[]): number[] {
    if(arr.length === 1) return [-1];
    let max = 0;
    let result = [];
    while(arr.length > 1){
        arr.splice(0, 1);
        max = Math.max(...arr);
        result.push(max);
    }
    result.push(-1);
    return result;
};
  • while循环 +Array.splice()
    • 边界处理和上面一样的,这里不再赘述
    • 数组splice方法传两个参数时,对数组做删除操作,改变原数组的长度,返回被删除元素。了解到这个的话,可以每次都将数组的第一位删除,再找出数组内剩余所有元素的最大值
    • while退出循环:当原数组被删除的只剩一个元素时退出,此时最后的元素就是数组的最后一个元素,后面push(-1)即可
    • 最后返回保存替换后的数组结果

结果

  • while性能好像不咋好,但是代码简洁一点
  • 双重遍历: image.png
  • while循环: image.png