查找最大乘积子阵列

Find maximum product subarray

本文关键字:阵列 查找      更新时间:2023-10-16

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

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;
}

维护一个迷你阵列有什么需要?你能解释一下这些行吗:

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?

minarray的目的是处理负数。

{-1, 42, -2}将返回 42 没有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]);
}

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。(两个分支都很好(。