难度:⭐
题目描述:
给你一个数组 arr
,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1
替换。
完成所有替换操作后,请你返回这个数组。
示例:
1 | 输入:arr = [17,18,5,4,6,1] |
提示:
1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5
解题过程:
思路:
直接模拟,遍历数组,对每一个元素找到它右边最大元素并替换,最后一个用-1替换。
c++代码:(执行用时1664ms,击败5.05%,内存消耗14.1M,击败16.20%)
1 | class Solution { |
官方题解:
方法一:逆序遍历
思路与算法
本题等价于对于数组 arr
中的每个元素 arr[i]
,将其替换成 arr[i + 1], arr[i + 2], ..., arr[n - 1]
中的最大值。因此我们可以逆序地遍历整个数组,同时维护从数组右端到当前位置所有元素的最大值。
设 ans[i] = max(arr[i + 1], arr[i + 2], ..., arr[n - 1])
,那么在进行逆序遍历时,我们可以直接通过
ans[i] = max(ans[i + 1], arr[i + 1])
来递推地得到答案。
c++代码:(执行用时32ms,击败62.78%,内存消耗14.2M,击败15.02%)
1 | class Solution { |
复杂度分析
时间复杂度:$O(N)$,其中 $N$ 是数组 $arr$ 的长度。
空间复杂度:$O(1)$,除了存储答案的数组 $ans$ 之外,额外的空间复杂度是 $O(1)$。
总结:
我的解法太暴力了🤣,效率太低。官方题解逆序遍历这个思路真妙,厉害。