一、题目
1、题目描述
给你一个数组 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 的元素右侧没有其他元素。
2、基础框架
cpp代码:
class Solution {
public:
vector<int> replaceElements(vector<int>& arr) {
}
};
C语言代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* replaceElements(int* arr, int arrSize, int* returnSize){
}
3、原题链接
二、解题报告
1、思路分析
(1)求出后缀最值:
d
p
[
i
]
dp[i]
dp[i]表示第
i
i
i 个元素右侧的最值,当求出了
d
p
[
i
+
1
]
dp[i+1]
dp[i+1] 的值后,
d
p
[
i
]
dp[i]
dp[i] 的值就是在“i+1个元素的最值”和“第i个元素”的值中的较大值;
(2)状态转移方程:
d
p
[
i
]
=
m
a
x
(
d
p
[
i
+
1
]
,
n
u
m
s
[
i
]
)
dp[i] = max(dp[i+1], nums[i])
dp[i]=max(dp[i+1],nums[i])
(3)初始状态:
d
p
[
n
−
1
]
=
n
u
m
s
[
n
−
1
]
dp[n - 1] = nums[n - 1]
dp[n−1]=nums[n−1]
2、时间复杂度
O ( n ) O(n) O(n)
3、代码详解
Cpp:
class Solution {
public:
//求后缀最值
void calPostMax(vector<int>& nums, vector<int>& postMax) {
for (int i = nums.size() - 1; i >= 0; --i) {
if (i == nums.size() - 1) {
postMax[i] = nums[i];
} else {
postMax[i] = max(postMax[i+1], nums[i]);
}
}
}
vector<int> replaceElements(vector<int>& arr) {
vector<int> postMax(10005);
calPostMax(arr, postMax);
vector<int> res(arr.size());
int i;
for (i = 0; i < arr.size() - 1; ++i) {
res[i] = postMax[i + 1];
}
res[i] = -1;
return res;
}
};
C语言:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int max(int a, int b) {
return a > b ? a : b;
}
void calPostMax(int *nums, int n, int *postMax) {
for (int i = n - 1; i >= 0; --i) {
if (i == n - 1)
postMax[i] = nums[i];
else
postMax[i] = max(postMax[i + 1], nums[i]);
}
}
#define maxn 10005
int* replaceElements(int* arr, int arrSize, int* returnSize){
int *ret = (int *)malloc(sizeof(int) * arrSize);
*returnSize = arrSize;
int postMax[maxn];
calPostMax(arr, arrSize, postMax);
for (int i = 0; i < arrSize; i++) {
if (i == arrSize - 1)
ret[i] = -1;
else
ret[i] = postMax[i + 1];
}
return ret;
}
4、小结
这类题目的特点是 数据量大,如果使用 n 2 n^2 n2的算法容易超时。

本文介绍了一种高效算法,用于将数组中每个元素替换成其右侧的最大元素。通过计算后缀最大值,实现O(n)的时间复杂度,避免了超时问题。
314

被折叠的 条评论
为什么被折叠?



