首页 > 代码库 > 【编程题目】求子数组的最大和 ☆
【编程题目】求子数组的最大和 ☆
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为 O(n)。
例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
因此输出为该子数组的和 18。
算法里学过,动态规划。具体思路想不起来了,看了看书。要动态算1-i个元素中必须包括第i个元素的最大子段和C[i],A是原始序列
C[i + 1] = A[i + 1] 如果C[i]<0
C[i] + A[i + 1] 如果C[i]>0
最后检查末尾是否有负数,若有去掉。
/*3.求子数组的最大和(数组)题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,因此输出为该子数组的和 18。*/#include <stdio.h>#include <stdlib.h>int Max_Sum(int * a, int len){ int * c = (int *)malloc(sizeof(int) * len); //存包括第i个数字的 a[0]-a[i]的最大子段和 int n = 0; //记录到第几个数字 int maxsum; c[0] = a[0]; for (n = 1; n < len; n++) { c[n] = (c[n - 1] < 0) ? a[n] : c[n - 1] + a[n]; } maxsum = c[n - 1]; free(c); int tmpn = len - 1; while (a[tmpn] < 0) { maxsum -= a[tmpn]; tmpn--; } return maxsum;}int main(){ int a[8] = {1, -2, 3, 10, -4, 7, 2, -5}; int m = Max_Sum(a, 8); return 0;}
网上有更加简化的版本:http://blog.sina.com.cn/s/blog_8b745a5f01014xur.html
没有必要存c的所有值,因为每次只用到了前一个值,再往前的都没有用了
#define max(a,b) ((a)>(b)?(a):(b)) //定义计算a,b两者中最大值的宏int maxsum(int arr[],int num){ int i; int maxsofar=0; //maxsofar记录到目前为止的最大值 int maxendinghere=0;//maxendinghere记录从当前位置开始往前几个连续的数的和的最大值(或0) for(i=0;i<num;i++) { maxendinghere=max(maxendinghere+arr[i],0); maxsofar=max(maxsofar,maxendinghere); } return maxsofar;}
【编程题目】求子数组的最大和 ☆
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。