C++ 查找具有最大和的连续子数组

C++ 查找具有最大和的连续子数组,c++,arrays,kadanes-algorithm,C++,Arrays,Kadanes Algorithm,下面是我的程序,用于从给定数组中查找子数组(连续)的最大和。使用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;

下面是我的程序,用于从给定数组中查找子数组(连续)的最大和。使用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;
}
#包括
#包括
使用名称空间std;
内特卡丹(内特a[],内特n){
int max_ending_here=a[0],max_till_now=a[0];
int _start=0,_end;
布尔s=真;
对于(int i=1;ia[i]&s==false)_start=i,s=true;
max_till_now=max(max_ending_在此,max_till_now);
如果(这里的max_end_+a[i]

但我还想找到具有最大和的连续子数组的开始和结束位置。我尝试在上面的程序中添加几行代码来实现这一点,但没有成功。所以我的问题是,如何才能得到具有最大和的子数组的起始位置和结束位置?谢谢。

像这样扩展函数签名:

int kadane(int a[], int n, int *start, int *end)
    *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);
在函数结束时,在返回之前,设置如下两个参数:

int kadane(int a[], int n, int *start, int *end)
    *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);
这样称呼它:

int kadane(int a[], int n, int *start, int *end)
    *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);

试着用这段代码做你想做的事情。忽略一些葡萄牙语单词(我的母语)

#包括
#包括
#包括
void seg_max(int*v,int n,int&x,int&y,int&max){
int i,j;
内质体;
max=-1;

对于(i=0;i要从函数中传递更多信息,请使用指针。下面应该可以

#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;
}
#包括
使用名称空间std;
内特卡丹(内特a[],内特n,内特*开始,内特*结束){
int max_ending_here=a[0],max_till_now=a[0];
布尔s=真;
对于(int i=1;ia[i]&s==false){
*开始=i;
s=真;
}
max_till_now=max(max_ending_在此,max_till_now);
if(此处的max_end_+a[i]
Wikipedia条目中的最大子数组问题是在一维数字数组(至少包含一个正数)中查找相邻子数组的任务我已经删除了我的评论,并将问题重新标记为C++:代码使用
名称空间
,虽然输出是通过
printf
。我想你的参考版本是可以的。很抱歉我的快速拍摄。没关系,我也很困惑:)也许可以简化并使用
*start
*end
,删除本地变量
\u start
\u end
。是的,但是在这里使用下划线作为
\u参数
有什么好的理由吗?我这样做只是为了让操作更容易进行,但你提出了一个好的观点。我会更改它。