我想尝试使用C编写Kadane算法。我不仅要返回最大子数组值,还希望返回开始索引和结束索引。
这是代码:
j
尽管最大和的答案是正确的,但是start和last的值确实很奇怪。我使用printf来检查kadane函数的for循环中start和last的值,在这里看起来工作正常。所以我认为问题可能与我返回变量的方式有关。
所以我修改了部分代码,如下所示:
#include <limits.h>
#include <stdio.h>
int kadane(int A[], int size){
int current_max = INT_MIN;
int global_max = INT_MIN;
int start, last;
for (int i = 0; i <= size; i++){
if (A[i] > A[i] + current_max){
current_max = A[i];
start = i;
} else {
current_max += A[i];
};
if (current_max >= global_max){
global_max = current_max;
last = i;
};
};
return (start, last ,global_max);
}
int main(){
int sum, size, start, last;
int A[] = {3,-4,5,1,9,-10,11,2,5,-1,2};
size = sizeof(A)/sizeof(A[0]);
start, last, sum = kadane(A, size-1);
printf("start at %d ; end at %d; sum : %d\n", start, last, sum);
return 0;
}
然后使用指针存储它们:
int kadane(int A[], int size){
......
......
return (&start, &last ,global_max);
}
然后我收到“ Segmentation Fault 11”错误。
我试图在这里理解和搜索我在做什么,但我找不到它。唯一可行的解决方案是将变量start和last存储在全局变量中,这样我就可以在任何地方调用而无需返回。但是我觉得那不是一个合适的解决方案。有人可以帮我吗?
答案 0 :(得分:3)
您有两种解决方案:
1:返回一个包含所有所需类型的结构。
struct data {
int start;
int last;
int global_max;
};
struct data kadane(int A[], int size){
stuct data test = { 1, 1, 1 };
......
......
return test;
}
void main() {
......
struct data t = kadane(A, ize);
}
2:使用指针传递值。
void kadane(int A[], int size, int *start, int *last, int *global_max) {
......
......
*start = 1;
*last= 1;
*global_max= 1;
}
void main() {
......
int a, b, c;
kadane(A, size, &a, &b, &c);
}