【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
网友评论