Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192876
  • 博文数量: 75
  • 博客积分: 2136
  • 博客等级: 大尉
  • 技术积分: 712
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-03 09:38
文章分类

全部博文(75)

文章存档

2011年(6)

2010年(17)

2009年(52)

我的朋友

分类: C/C++

2009-04-23 22:39:04

题目:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
 
例如: 输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
 
思路:本题基于一个简单的思想,加上一个正数会使原有的数变大,而加上一个负数会使原有的数变小,具体做法是依次遍历数组中的每一个数,并记下截至当前位置的最大和及当前和,如果当前和小于0就应该舍弃之,而从新的位置开始计算。另外对于一个既包含正数又包含负数的整型数组,其最大的子数组的和至少应该大于0。
 
代码:
//////////////////////////////////////////////
/// Find the greatest sum of all sub-arrays
/// input:
///      data: the data array
///      greatestsum: the greatest sum of all sub-arrays
/// output:
///      true: find success
///      false: find failed
/////////////////////////////////////////////
bool FindGreatestSumOfSubArray(vector& data, int& greatestsum)
{
 if(data.empty())
 {
  return false;
 }
 
 int begin = 0;
 int end = 0;
 int tempbegin = 0;
 int tempsum = 0;
 
 greatestsum = 0;
 
 for(int i = 1; i < data.size(); ++i)
 {
  tempsum += data[i];
  
  if(tempsum < 0)
   {
    tempsum = 0;
    tempbegin = i+1;
   }
  
   if(tempsum > greatestsum)
   {
    greatestsum = tempsum;
    begin = tempbegin;
    end = i;
   }
 }
 
 return true;
}
阅读(2402) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-08-30 13:43:58

if(tempsum > greatestsum) { greatestsum = tempsum; begin = tempbegin; end = i; } 这步有问题 还要加上 else if(tempsum < greatestsum) { tempsum=0; }