文章

149

粉丝

195

获赞

0

访问

19.0k

头像
2025 年 9 月第 2 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年11月28日 17:46
阅读数 6

1)

这个问题要求对每个位置 i,计算以 A[i] 结尾的所有连续子数组的乘积最大值。
因为乘积有正负号影响,一个很小的负数乘一个负数可能变成很大的正数,所以我们需要同时维护 以 A[i] 结尾的连续子数组乘积的最大值 和 最小值。

设:

  • maxEndingHere[i]:以 A[i] 结尾的连续子数组乘积的最大值

  • minEndingHere[i]:以 A[i] 结尾的连续子数组乘积的最小值

递推关系:

  • 当 i = 0 时:

    maxEndingHere[0]=A[0],minEndingHere[0]=A[0]maxEndingHere[0]=A[0],minEndingHere[0]=A[0]
  • 当 i > 0 时:

    maxEndingHere[i]=max⁡(A[i], A[i]×maxEndingHere[i−1], A[i]×minEndingHere[i−1])
  • minEndingHere[i]=min⁡(A[i], A[i]×maxEndingHere[i−1], A[i]×minEndingHere[i−1])
  • 然后 res[i] = maxEndingHere[i]

2)

void calMulMax(int A[], int res[], int n) {
    if (n == 0) return;
    
    // 初始化:以 A[0] 结尾的最大和最小乘积就是 A[0] 本身
    int maxEndingHere = A[0];
    int minEndingHere = A[0];
    res[0] = A[0];
    
    for (int i = 1; i < n; i++) {
        // 保存旧值,因为下面计算会覆盖
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发