您的位置:首页 > 职场人生

微软面试100题系列-数组连续和最大

2014-02-15 03:05 295 查看
题目:

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

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

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

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

因此输出为该子数组的和 18。
#include <stdio.h>
#include <stdlib.h>

#define MIN_INT (1 << (sizeof(int) * 8 - 1) | 1)

int max_sum(int * arr, int sz)
{
int i, j, sum, max_sum = MIN_INT;

int * p_tmp = (int *)malloc(sizeof(int) * sz);
if(NULL == p_tmp || sz < 0)
return MIN_INT;

p_tmp[0] = arr[0];
for(i = 1; i < sz; i++)
p_tmp[i] = p_tmp[i - 1] + arr[i];

for(i = 0; i < sz; i++)
{
for(j = i; j < sz; j++)
{
if(i == j)
sum = arr[i];
else
sum = p_tmp[j] - p_tmp[i];

if(sum > max_sum)
max_sum = sum;
}
}

if(p_tmp != NULL)
free(p_tmp);
return max_sum;
}

int main(int c, char * v[])
{
int arr[] = {1, -2, 3, 10, -4, 7, 2, -5};

printf("%d\n", max_sum(arr, sizeof(arr) / sizeof(int) ));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: