您的位置:首页 > 其它

输入一个整形数组,求所有子数组的和的最大值

2013-03-06 23:45 369 查看
本想将最大值所对应的字串也打印出来的,但是想来想去,想不到用什么办法来记录字串的两个边界值。请各位达人不吝惜指教

/*
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define ARRAY_SIZE 20

/* 用随机数填写数组 */
void fillArrayWithRand(int iarray[], int num)
{
int i = 0;
int itmp = 0;

srand((int)time(0)); /* 如果不设置随机种子那么每次产生的随机数都是一样的 */

for (; i < num; ++i)
{
itmp = (rand()) % 0xf; /* 产生15之内的随机数 */

/* 产生正负数 */
if (0 == itmp % 2)
{
iarray[i] = itmp;
}
else
{
iarray[i] = -itmp;
}
}

for (i = 0; i < ARRAY_SIZE; ++i)
{
printf("%d ", iarray[i]);
}

printf("\n");

}

void findMaxValueSubArray(int iarray[], int num)
{
int isum = 0;
int i = 0;
int itmp = 0;

for (; i < num; ++i)
{
if (isum < 0)
{
isum = iarray[i];
}
else
{
isum += iarray[i];
}

/* 将最大值记录下来 */
if (itmp < isum)
{
itmp = isum;
}
}

printf("isum = %d \n", isum);
}

int main()
{
int iarray[ARRAY_SIZE];

/* 产生一个正负数的数列 */
fillArrayWithRand(iarray, ARRAY_SIZE);

/* 计算出字串的最大值 */
findMaxValueSubArray(iarray, ARRAY_SIZE);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐