1299. 将每个元素替换为右侧最大元素『简单』

Posted 知音12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1299. 将每个元素替换为右侧最大元素『简单』相关的知识,希望对你有一定的参考价值。

题目来源于力扣(LeetCode

一、题目

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

题目相关标签:数组

提示:

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

二、解题思路

2.1 暴力法

  1. 遍历 nums 数组,对于每个元素都遍历一遍其索引后的全部元素

2.2 线性扫描——倒序

  1. 倒序遍历 nums 数组,从倒数第二位元素开始(倒数第一位元素赋值为 -1)

  2. 定义记录右侧最大值的变量初始值为数组最后一位元素

  3. 然后对于每个遍历的元素,都进行判断,是否小于右侧最大值

  4. 小于时,当前索引上的元素赋值为右侧最大值

  5. 大于时,当前索引上的元素赋值为右侧最大值,并让当前遍历的元素成为右侧最大值(通过临时变量完成转换)

三、代码实现

3.1 暴力法

public static int[] replaceElements(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int max = arr[i + 1];
        // 遍历当前数组元素后的全部元素,记录下最大值
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] > max) {
                max = arr[j];
            }
        }
        arr[i] = max;
    }
    arr[arr.length - 1] = -1;
    return arr;
}

3.2 线性扫描——倒序

public static int[] replaceElements(int[] arr) {
    int maxRightNum = arr[arr.length - 1];
    // 数组末位元素用 -1 代替
    arr[arr.length - 1] = -1;
    // 从右往前遍历
    for (int i = arr.length - 2; i >= 0; i--) {
        if (arr[i] < maxRightNum) {
            // 小于右侧最大值时,当前元素设置为当前记录的右侧最大值
            arr[i] = maxRightNum;
        } else {
            // 大于右侧最大值时,当前元素成为新的最大值
            int temp = arr[i];
            arr[i] = maxRightNum;
            maxRightNum = temp;
        }
    }
    return arr;
}

四、执行用时

4.1 暴力法

4.2 线性扫描——倒序

五、部分测试用例

public static void main(String[] args) {
    int[] arr = {17, 18, 5, 4, 6, 1};  // output: {18, 6, 6, 6, 1, -1}

    int[] result = replaceElements(arr);
    System.out.println(result);
}

以上是关于1299. 将每个元素替换为右侧最大元素『简单』的主要内容,如果未能解决你的问题,请参考以下文章

算法leetcode|1299. 将每个元素替换为右侧最大元素(rust和go)

算法leetcode|1299. 将每个元素替换为右侧最大元素(rust和go)

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

LeetCode刷题(53)~将每个元素替换为右侧最大元素从后往前看

c_cpp 用右侧最大的元素替换每个元素

1299. Replace Elements with Greatest Element on Right Side