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

2020-08-10  本文已影响0人  Chiduru

【Description】
给你一个数组 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

【Idea】
遍历少不了:每个下标i上的元素,都会被max(arr[i+1:])代替。
所以暴力解的话,每个下标i上的元素被替换,都会再遍历(length-i)次来找替代值。

以此基础上优化一下子, 假设整个数组的最大值恰好在arr[-1],那么替换每个元素时, 都只需要在i=0时遍历得到arr[-1], 就可以开启无脑替代了
所以优化点就是: 在寻找右侧最大值时,顺便保存最大值对应下标idx。当继续替换下一个元素时,对比idx是否依然在该元素右侧即可。

【Solution】

class Solution:
    def replaceElements(self, arr: List[int]) -> List[int]:
        n, idx = arr[0], 0        # 标记右侧最大值和对应下标
        for i in range(len(arr)):
            if i == len(arr)-1:
                arr[i] = -1
            elif i == len(arr)-2:
                arr[i] = arr[-1]
            elif i == idx:    # 当前标记最大值是遍历值,需重新在右侧找
                n, idx = arr[i+1], i+1
                for j in range(i+1, len(arr)):
                    if arr[j] > n:
                        idx = j
                        n = arr[j]
                arr[i] = n
            else:
                arr[i] = n 
        return arr

截屏2020-08-10 上午12.47.46.png
上一篇下一篇

猜你喜欢

热点阅读