我正在解决C ++上的最大乘积子数组问题。我的代码仅找到子数组的max.product,而没有找到范围。
我在这里找到了一些解释-https://www.geeksforgeeks.org/maximum-product-subarray/,并使用了代码。如何找到给我最大乘积的子数组范围(左索引,右索引)? (我在这里找到了一些类似的帖子,但是所有的帖子都在Java上,我无法正确理解它们)
#include<bits/stdc++.h>
#include <stdio.h>
using namespace std;
int min(int x, int y) {
return (x < y) ? x : y;
}
int max(int x, int y) {
return (x > y) ? x : y;
}
int solve(int a[], int n){
int maxend = 0, minend = 0;
int maxans = 0;
for (int i = 1; i <= n; i++){
int temp = maxend;
maxend = max(a[i], max(a[i] * maxend, a[i] * minend));
minend = min(a[i], min(a[i] * temp, a[i] * minend));
maxans = max(maxans, maxend);
}
return maxans;
}
int main(void){
int n, a[10000];
cin >> n;
for(int i=1; i<=n; i++){
cin >> a[i];
}
cout << solve(a, n);
return 0;
}
答案 0 :(得分:0)
如果仅需要范围信息,则可以跟踪maxans
变量已更改的索引。这将向您指示最大乘积来自何处,这将是该范围的正确终点。然后,在计算出maxans
之后,您基本上可以向左走,直到获得最大乘积,这时您将找到左间隔。
以下实现可以作为演示。
int solve(int a[], int n){
int maxend = 0, minend = 0;
int maxans = 0;
int max_r = -1;
for (int i = 1; i <= n; i++){
int temp = maxend;
maxend = max(a[i], max(a[i] * maxend, a[i] * minend));
minend = min(a[i], min(a[i] * temp, a[i] * minend));
if(maxans < maxend){
maxans = maxend;
max_r = i;
}
}
int max_l = max_r;
for(int i=1; i < maxans; max_l--){
i = i * a[max_l];
}
//At this point you have the range [max_l, max_r] that yield maxans as the product
return maxans;
}