找不到最大乘积子数组的范围

时间:2019-04-06 09:52:18

标签: c++

我正在解决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;
}

1 个答案:

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