如何获得具有所有项目的最大总和的子数组

时间:2016-08-12 06:14:49

标签: c#

我的测试是解决以下问题: 给出了由N个整数组成的零索引数组A. 编写一个解决方案来找出A的子数组,其中包含具有所有项目最大总和的后续项目。

示例:

  • A = [2, -1, 3, -3, 4, -9, 10, -3, 4, -4, -7, 2, 8]。答案是[10, -3, 4]

  • A = [3, 2, -5, 7, 4, -8, 3, -5, 2, 4, -2, 4]。答案是[7, 4]

  • A = [-2, 5, 3, 6, -1,-5]。答案是[-2, 5, 3, 6]

请帮我解决一下。

1 个答案:

答案 0 :(得分:1)

基本上,您需要做的是遍历数组并检查元素总和的最大值。找到最大总和后,您将获得所得子阵列的最后一个元素。 一旦找到了max元素,就需要遍历并执行相同的操作,以便找到具有最大元素总和的子数组。

int iNewTopHigh = 0;
int iNewTopLow  = 0;
int iIndNewTopHigh = 0;
int iIndNewTopLow  = 0;
int iSumHigh   = 0;
int iSumLow    = 0;

int[] iArr  =  {2, -1, 3, -3, 4, -9, 10, -3, 4, -4, -7, 2, 8};
               //{3, 2, -5, 7, 4, -8, 3, -5, 2, 4, -2, 4};
               //{-2, 5, 3, 6, -1,-5};
//Get the top 
for(int i = 0; i < iArr.Length; i++){   
    iSumHigh += iArr[i];
    if(iSumHigh > iNewTopHigh){ 
      iIndNewTopHigh = i;
      iNewTopHigh = iSumHigh;             
    }           
}
//Get the bottom
for(int i = iIndNewTopHigh; i != 0; i--){
    iSumLow += iArr[i];
    if(iSumLow > iNewTopLow){
       iIndNewTopLow = i;
       iNewTopLow = iSumLow;
    }
}
//Print results
for(int i = iIndNewTopLow ; i <= iIndNewTopHigh; i++){
    Console.Write(iArr[i] + ", ");
}