【问题标题】:Finding the contiguous sub array with max sum查找具有最大总和的连续子数组
【发布时间】:2015-07-27 18:48:40
【问题描述】:

这是我的程序,用于从给定数组中找到子数组(连续)的最大和。使用kadane的算法很容易。

#include <iostream>
#include <cstdio>

using namespace std;

int kadane(int a[], int n) {

    int max_ending_here = a[0], max_till_now = a[0];

    int _start = 0, _end;

    bool s=true;

    for (int i = 1; i < n; ++i)
    {
        max_ending_here = max(a[i], max_ending_here + a[i]);

        if(max_ending_here + a[i] > a[i] && s==false) _start = i, s=true;

        max_till_now = max(max_ending_here, max_till_now);

        if(max_ending_here + a[i] < a[i] && s==true) _end=i-1,s=false;
    }

     printf("S = %d , E = %d\n",_start,_end);

    return max_till_now;
}

int main(int argc, char const *argv[])
{
    //int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
    int a[6] = {-8,-1,-1,-1,-1,-5};
    int m = kadane(a, 6);
    printf("%d\n",m);
    return 0;
}

但我也想找到具有最大和的连续子数组的开始和结束位置。我尝试在上面的程序中添加几行来做到这一点,但它没有用。所以我的问题是如何获得具有最大总和的子数组的开始和结束位置?谢谢。

【问题讨论】:

标签: c++ arrays kadanes-algorithm


【解决方案1】:

像这样扩展函数签名:

int kadane(int a[], int n, int *start, int *end)

在函数的最后,在return之前设置两个参数如下:

    *start = _start;
    *end = _end;
    return max_till_now;
}

然后这样称呼它:

int start, end;  
int m = kadane(a, 6, &start, &end);
printf("sum: %i, start %i, end: %i\n",m, *start, *end);

【讨论】:

  • 我删除了我的评论并将问题重新标记为 C++:代码使用 namespace&lt;iostream&gt;,尽管输出是来自 &lt;cstdio&gt;printf。我认为您的参考版本还可以。抱歉我的快速拍摄。
  • 没关系,我也很困惑 :)
  • 也许可以简化和使用*start*end,删除本地变量_start_end
【解决方案2】:

尝试以此代码为基础来做你想做的事。忽略一些葡萄牙语(我的母语)的单词。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void seg_max(int *v, int n, int & x, int &y , int & max){
 int i,j;
 int soma; 
 max = -1; 
 for(i=0;i<n;i++){
  soma = 0;
  for(j=i;j<n;j++){
   soma += v[j];
   if( soma > max ){
    max = soma;
    x = i;
    y = j;
   }
  }
 }
}

int main(){
int x,y,max;
int v[] = {-2,1,-3,4,-1,2,1,-5,4};
seg_max(v,9,x,y,max);
printf("max sum [%d-%d] with the sum equal to %d\n", x,y,max);
}

【讨论】:

    【解决方案3】:

    要从函数中传递更多信息,请使用指针。下面应该可以工作。

    #include <cstdio>
    
    using namespace std;
    
    int kadane(int a[], int n, int* start, int* end ) {
    
        int max_ending_here = a[0], max_till_now = a[0];
    
        bool s=true;
    
        for (int i = 1; i < n; ++i)
        {
            max_ending_here = max(a[i], max_ending_here + a[i]);
    
            if(max_ending_here + a[i] > a[i] && s==false) {
                 *start = i;
                 s=true;
            }
    
            max_till_now = max(max_ending_here, max_till_now);
    
            if(max_ending_here + a[i] < a[i] && s==true) {
                *end = i-1;
                s = false;
            }
        }
    
        return max_till_now;
    }
    
    int main(int argc, char const *argv[])
    {
        //int a[10] = {1,-3,2,-5,7,6,-1,-4,11,-23};
        int a[6] = {-8,-1,-1,-1,-1,-5};
        int start = 0, end = 0;
        int m = kadane(a, 6, &start, &end);
        printf("Max: %d, Start: %d, End: %d\n",m, start, end);
        return 0;
    }
    

    【讨论】:

    • 是的,但这里有充分的理由在_arguments 中使用下划线吗?
    • 我这样做只是为了让 OP 可以更轻松地跟进,但你说得很好。我会改的。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2020-04-29
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多