C++ 查找具有最大和的连续子数组
下面是我的程序,用于从给定数组中查找子数组(连续)的最大和。使用kadane的算法非常简单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;
#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参数
有什么好的理由吗?我这样做只是为了让操作更容易进行,但你提出了一个好的观点。我会更改它。