查找最大乘积子数组

时间:2020-05-14 09:36:49

标签: c++ arrays vector dynamic-programming sub-array

我们需要找到一个数组(包含至少一个数字)中具有最大乘积的连续子数组,并返回一个与最大乘积相对应的整数。 我发现这段代码可以解决同样的问题:

int maxProduct(const vector<int> &A)
{
    int n = A.size();
    vector<int> maxarray(n);
    vector<int> minarray(n);
    maxarray[0] = A[0];
    minarray[0] = A[0];
    int result = A[0];
    for(int i=1;i<n;i++){
        if(A[i]>0){
            maxarray[i] = max(A[i],maxarray[i-1]*A[i]);
            minarray[i] = min(A[i],minarray[i-1]*A[i]);
        }else{
            maxarray[i] = max(A[i],minarray[i-1]*A[i]);
            minarray[i] = min(A[i],maxarray[i-1]*A[i]);
        }
        result = max(result,maxarray[i]);
    }

    return result;
}

维护minarray有什么需要?您能解释一下这些行吗?

if(A[i]>0){
            maxarray[i] = max(A[i],maxarray[i-1]*A[i]);
            minarray[i] = min(A[i],minarray[i-1]*A[i]);
        }else{
            maxarray[i] = max(A[i],minarray[i-1]*A[i]);
            minarray[i] = min(A[i],maxarray[i-1]*A[i]);
        }

我们为什么要像上面的代码行那样更新maxarray和minarray?

1 个答案:

答案 0 :(得分:2)

minarray的目的是处理负数。

{-1, 42, -2}将返回不包含minarray的42。

if (A[i]>0){
    maxarray[i] = max(A[i], maxarray[i-1]*A[i]);
    minarray[i] = min(A[i], minarray[i-1]*A[i]);
} else {
    maxarray[i] = max(A[i], minarray[i-1]*A[i]);
    minarray[i] = min(A[i], maxarray[i-1]*A[i]);
}

A[i]为正时,prev*A[i]不会改变符号。 其他情况:前一个值为0

所以直到索引i为止的最大乘积

  • A[i],如果maxarray[i-1]为0(或初始化时为负)
  • maxarray[i-1]*A[i]其他

std::max简化了条件。

以同样的方式,最小乘积(最大负数)将为std::min(A[i], minarray[i-1] * A[i])

当A [i]为负数时,prev*A[i]确实会改变符号。 所以最大值必须取先前的最小值

maxarray[i] = max(A[i], minarray[i-1] * A[i]);

A[i] == 0时,最大值和最小值均为0。 (两个分支都适合)。