2016-04-28 95 views
2

这是我的程序,用于查找最大最大连续子序列总和。我能够计算总和。如何修改这段代码以找到这个最大子序列和的开始和结束索引?查找最大连续子序列总和的开始和结尾

int maxSubArraySum(int a[], int size) 
{ 
    int final_max = 0, curr_max = 0; 
    for (int i = 0; i < size; i++) 
    { 
     curr_max = curr_max + a[i]; 
     if (curr_max < 0) 
      curr_max = 0; 

     else if (final_max < curr_max) 
      final_max = curr_max; 
    } 
    return final_max; 
} 
+0

请问您可以将输入示例与期望的输出? –

+0

输入:2,-6,7,-3,12输出:2,4,因为最大的连续和是元素7,3,12等于16并且索引7是2而12的索引是4。 – XZ6H

+0

我完全不理解你的代码的逻辑。例如,如果所有数字都是负数,那么您将在每次迭代中将'curr_max'重置为零。 – user463035818

回答

0

你只需要记住开始总和以及总和结束的位置的索引。

struct SumAndRange{ 
    int sum; 
    int start; 
    int stop; 
    SumAndRange() : sum(0),start(0),stop(0) {} 
}; 

SumAndRange maxSubArraySum(int a[], int size) { 
    SumAndRange curr;    // we will start with the sum of the first element 
    SumAndRange final; 
    for (int i = 0; i < size; i++) { 
     curr.sum = curr.sum + a[i]; 
     if (curr.sum < 0) {   // if we reset the sum it will 
      curr.sum = 0;   // start with the next index 
      curr.start = i+1;  
      curr.stop = i+1;   // ...and we also handle the case of 
            // the sum is only one element 

     } else {      // otherwise the sum continues with 
      curr.stop = i;   // this index 
      if (final.sum < curr.sum) { final = curr; } 
     } 
    } 
    return final; 
} 

int main() { 
    int a[] = { 2,-6,7,-3,12}; 
    SumAndRange sar = maxSubArraySum(a,5); 
    std::cout << sar.sum << " " << sar.start << " " << sar.stop << std::endl; 
    return 0; 
}