设计包含min函数的栈
在二元树中找出和为某一值的所有路径

求子数组的最大和

uno posted @ 2011年10月03日 15:47 in 微软面试百题 with tags 微软百题 , 1138 阅读

题目:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,

因此输出为该子数组的和18。

 

题目只要求连续最大子段和,这很简单,扫描一遍整个数组,将数组元素一个个加起来,如果大于当前最大和,则更新最大和,否则不更新,如果最大和变为负数,则将最大和置零,因为连续最大子段和不可能包含使当前最大和为负的元素。

 

#include <iostream>
using namespace std;

int getMaxSum(int num[],int n)
{
    int sum,max;
    sum = max = 0;
    for(int i = 0;i < n;i++)
    {
        sum+=num[i];
        if(sum > max)max = sum;
        if(sum < 0)sum = 0;
    }
    return max;
}
int main()
{
    int a[10] = {1,-8,6,3,-1,5,7,-2,0,1};
    
    cout<<getMaxSum(a,10)<<endl;
    
    system("pause");
    return 0;
}

 

Avatar_small
seaslee 说:
2011年10月04日 15:26

Programming Pearls 第八章讲的经典例子呀!感觉这种题还是得费一些时间的,不知道是不是现在获取知识更容易了,还是我们的大脑比前辈更NB了,这种算法还是在研讨会上一个统计学家提出的。当时那些大牛才达到了O(nlgn).

Avatar_small
uno 说:
2011年10月05日 13:00

@seaslee:应该是说现在想问题更深了,这种题的话一看到首先想的肯定是DP,呵呵。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter