美文网首页
1299. 将每个元素替换为右侧最大元素

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

作者: Chiduru | 来源:发表于2020-08-10 00:48 被阅读0次

    【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

    相关文章

      网友评论

          本文标题:1299. 将每个元素替换为右侧最大元素

          本文链接:https://www.haomeiwen.com/subject/eiqddktx.html