和最大的子序列之二

void MaxSubSet_2(int nums[], int length)  
{  
    if (length == 0)  
        return;  
  
    int start = 0;  
    int sum = nums[0];  
  
    int maxStart = 0;  
    int maxEnd = 0;  
    int maxSum = nums[0];  
      
    for (int i = 1; i < length; i++)  
    {  
        sum += nums[i];  
  
        if (sum > maxSum)  
        {  
            maxStart = start;  
            maxEnd = i;  
            maxSum = sum; //更新最大值 
        }  
  
        if (sum < 0)  //放弃i之前的元素,他们的和开始变为为负数
        {  
            start = i + 1;  //下一个位置设置为开始位置
            sum = 0;  
        }  
    }  
  
    cout << "Max: " << maxSum << " ( " << maxStart << ", " << maxEnd << " )" << endl;  
}  


当添加a[i],这一个元素的时候,判断如果加上a[i]之后的和大于当前的最大值;如果当前这段数据的和是开始变为负数的话,就要舍弃这段元素;更新开始的位置。

原文地址:https://www.cnblogs.com/plxx/p/3232911.html