问题描述:
给定一个字数组,数组里可能有整数,负数和零,数组中
连续的一个或多个整数组成一个子数组,每个字数组都有一个和,求所有字数组和的最大值
思路;
新建一个变量currsum表示当前字数组的和,若小于0,则令currsum = 下一个元素
c代码如下:
-
#include<stdio.h>
-
#include<stdlib.h>
-
int findMaxSum(int *a,int n)
-
{
-
int maxSum = a[0];
-
int currsum = 0;
-
int i = 0;
-
for (i = 0;i < n;i++)
-
{
-
//currsum += a[i];
-
if (currsum < 0)
-
{
-
// i = i+1;
-
currsum = a[i];
-
}
-
else
-
{
-
-
currsum += a[i];
-
// i = i+1;
-
}
-
if (currsum > maxSum)
-
maxSum = currsum;
-
}
-
return maxSum;
-
}
-
int main()
-
{
-
int a[8] = {-2,-1,-3,-5,-6,-7,-4,-8};
-
int max = findMaxSum(a,8);
-
printf("%d\n",max);
-
return 0;
-
}
运行结果如下(返回最大的负数)
[root@localhost ~]# ./a.out
-1
[root@localhost ~]#
如果要求出最大字数组的和,但
不要求字数组是连续的
思路:跳过负数即可(有整数,有负数,有0)
全是负数的情况需要返回最大负数
c代码如下
-
#include<stdio.h>
-
#include<stdlib.h>
-
int whetherNegtive(int *a,int n)//判断数组是否全为负数
-
{
-
int i = 0;
-
for (i = 0;i < n;i++)
-
if(a[i] >= 0)
-
return 0;
-
return 1;
-
}
-
int findMaxSum(int *a,int n)
-
{
-
int maxSum = a[0];
-
int currsum = 0;
-
int i = 0;
-
for (i = 0;i < n;i++)
-
{
-
//currsum += a[i];
-
if (a[i] >= 0)
-
{
-
currsum += a[i];
-
}
-
else
-
{
-
if (whetherNegtive(a,n))
-
currsum = a[i];
-
}
-
if (currsum > maxSum)
-
maxSum = currsum;
-
}
-
return maxSum;
-
}
-
int main()
-
{
-
int a[8] = {-2,-3,-1,-4,-5,-6,-7,-8};
-
int max = findMaxSum(a,8);
-
printf("%d\n",max);
-
return 0;
-
}
运行结果如下:
[root@localhost ~]# ./a.out
-1
[root@localhost ~]#
阅读(659) | 评论(0) | 转发(0) |