1) 算法基本思想
我们需要为每个 res[i] 计算 A[i] 与 A[j](其中 i ≤ j ≤ n-1)乘积的最大值。可以采用以下方法:
预处理最大值和最小值:从左到右遍历数组,维护从当前位置到数组末尾的最大值和最小值。因为乘积的最大值可能是当前元素与后续最大值的乘积,也可能是与后续最小值的乘积(如果当前元素是负数)。
计算 res[i]:对于每个 A[i],计算 A[i] * max_suffix 和 A[i] * min_suffix 的最大值,然后与 max_suffix 和 min_suffix 比较,更新 res[i]。
更新最大值和最小值:在遍历过程中,动态更新从当前位置到末尾的最大值和最小值。
2) C/C++ 代码实现
void CalMulMax(int A[], int res[], int n) {
if (n == 0) return;
// 初始化当前的最大值和最小值
int max_suffix = A[n - 1];
int min_suffix = A[n - 1];
res[n - 1] = A[n - 1]; // 最后一个元素的 res 是其本身
for (int i = n - 2; i >= 0; --i) {
// 计算当前元素与后续最大值和最小值的乘积
int candidate1 = A[i] * max_suffix;
int candidate2 = A[i] * min_suffix;
// res[i] 是 A[i]、candidate1、candidate2 中的最大值
res[i] = max(A[i], max(candidate1, candidate2));
// 更新 max_suffix 和 min_suffix 为 A[i]、A[i]*max_suffix、A[i]*min_suffix 的极值
int temp_max = max(A[i], max(candidate1, candidate2));
int temp_min = min(A[i], min(candidate1, candidate2));
max_suffix = temp_max;
min_suffix = temp_min;
}
}
3)时间、空间复杂度
时间复杂度: O (n)。
空间复杂度: O (1)。
登录后提交答案
暂无评论,来抢沙发