本想将最大值所对应的字串也打印出来的,但是想来想去,想不到用什么办法来记录字串的两个边界值。请各位达人不吝惜指教
/*
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为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;
}