Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
这道题是找出数组中的一个子序列,要求这个子序列中数的乘积是所有子序列中最大的。
如果不考虑效率与优化问题,可以直接将所有子序列的组合列举出来,分别求它们的积,取最大值。如下:
int maxProduct(int A[], int n) {
int i = 0, j = 0,k=0;
int ans = 0;
int product = 0;
for (i = n; i > 0; i--){
for (j = 0; j <= n-i; j++){
for (k = j; k < i; k++){
product += A[k];
}
if (product>ans){
ans = product;
}
product = 0;
}
}
return ans;
}
但是这样的效率是很低的。换个思路可以想到,这道题就是一维动态规划中的“局部最优与全局最优”。所以需要维护两个变量,当前位置连续乘积的最大值curMax和最小值curMin。
最大值与最小值由以下三种情况可以得到:上一次的curMax*A[i],上一次的curMin*A[i],A[i]本身。如下:
int maxProduct(int A[], int n) {
int ans = A[0];
int curMin = A[0];
int curMax = A[0];
int cur = 1;
for (int i = 1; i < n; i++){
cur = curMax;
curMax = max(max(A[i],A[i]*curMax),A[i]*curMin);
curMin = min(min(A[i], A[i] * cur), A[i] * curMin);
ans = max(ans, curMax);
}
return ans;
}
时间: 2024-10-27 00:05:43