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

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

问题描述

给定一个整数数组 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. 初始化变量:

    • 使用一个变量 mx 来记录右侧最大值。初始值为 -1,因为数组的最后一个元素的右侧没有元素,应该替换为 -1
  2. 从右到左遍历:

    • 对于每个元素,首先将该元素的值替换为 mx,然后更新 mx 为当前元素与 mx 中较大的值。
  3. 返回修改后的数组:

    • 遍历结束后,数组中的每个元素都会被替换为它右侧的最大值。

代码实现

from typing import List

class Solution:
    def replaceElements(self, arr: List[int]) -> List[int]:
        n = len(arr)
        mx = -1  # 初始化右侧最大值为 -1
        
        # 从右向左遍历数组
        for i in range(n - 1, -1, -1):
            x = arr[i]
            arr[i] = mx  # 当前元素替换为右侧最大值
            mx = max(mx, x)  # 更新右侧最大值
        
        return arr

解释:

  1. n = len(arr):获取数组的长度。
  2. mx = -1:初始化右侧最大值为 -1
  3. for i in range(n - 1, -1, -1):从数组的最后一个元素开始,向前遍历。
  4. arr[i] = mx:将当前元素替换为右侧最大值。
  5. mx = max(mx, x):更新右侧最大值为当前元素与 mx 中较大的值。
  6. 最终返回修改后的数组 arr

时间复杂度

  • 时间复杂度: O(n),其中 n 是数组的长度。我们只需要遍历一次数组。
  • 空间复杂度: O(1),我们只使用了常数空间。

总结

这个问题通过从右到左遍历数组,并使用一个变量来跟踪右侧的最大值,能够有效地完成替换操作。这样的做法使得我们能够在 O(n) 的时间内完成任务,且不需要额外的空间。

应用场景

这种问题常常出现在与数组操作相关的场景中,特别是在需要对数组进行部分替换或计算时,能有效减少时间复杂度。

你可能感兴趣的:(每日算法,算法,数据结构)