我们需要找到一个数组(包含至少一个数字)中具有最大乘积的连续子数组,并返回一个与最大乘积相对应的整数。 我发现这段代码可以解决同样的问题:
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?
答案 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
。 (两个分支都适合)。