求子数组之和最大值

求子数组之和最大值

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008;

制图工具:office 2010 powerpoint;

硬件信息:7G-3 笔记本;

真言

让自己爆发吧,不要在安于现状了。

题目

求子数组之和最大值。

方案

我的算法执行如下,C++表示如下(时间复杂度为 O(n))

// 求数组的子数组之和的最大值
	int Array::Max_Sub_Array(int *data,unsigned int const length)
	{
	// 异常输入
		if(data == NULL || length == 0)
		{
			cout<<"异常输入"<<endl;
			return 0;
		}

	// 正常输入
		// 如果数组长度为1,直接返回
			if(length == 1) return data[0];

		bool all_fushu = true ;
		int max = data[0];

	// 检查是否所有的数是否都是负数,并记录最大值
		for(unsigned int i = 0;i<length;i++)
		{
			if(data[i] >= 0)
			{
				all_fushu = false;
				break;
			}
			if(data[i] > max)
				max = data[i];
		}

	// 如果都是负数
		if(all_fushu == true)
		{
			return max;
		}

	// 如果不都是负数
		else
		{
		// 核心算法 初始化
			int left_sum = data[0],right_sum = data[length-1] ;
			int left = 0,right =length-1;

		// 选择前进方向
		while(left < right-1)
		{
			if(left_sum < right_sum)
			{
				if(left_sum < 0)
					left_sum = 0;
				left++;
				left_sum += data[left];
			}
			else
			{
				if(right_sum < 0)
					right_sum = 0;
				right--;
				right_sum += data[right];
			}
		}

		// 寻求结果
			int result = 0;
			if(left_sum > 0)
				result += left_sum;
			if(right_sum > 0)
				result += right_sum;
			return result;
		}
	}

求子数组之和最大值,布布扣,bubuko.com

时间: 2024-10-13 16:21:49

求子数组之和最大值的相关文章

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

子数组之和最大值

问题描述 给定一个序列\(A_0\).\(A_1\).\(A_2\).....\(A_{n-1}\),求\(A_i+A_{i+1}+...+A_j\)的最大值. 解一 暴力枚举左端点\(i\)和右端点\(j\),之后计算\(A_i\)和\(A_j\)之间的和,时间复杂度\(O(n^3)\),很容易TLE. #define INF 0x7FFFFFFF int sub_sum(int a[],int n) { int MAX = -INF; for(int i = 0;i < n;i++) { f

求子数组之和的最大值——编程之美 2.14 扩展问题 正确实现

使用动态规划求最大子数字和: s[i]表示data[i~n-1]以元素i开始的最大子数组和,a[i]表示data[i~n-1]中的最大子数组和 : s[i]=max(s[i+1]+data[i], data[i]); a[i]=max(a[i+1], s[i]); 由于数组s,a递推的时候,都只用到数组的前一个变量,所以可以用滚动数组节省空间. 扩展问题: 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使其和最大,怎么办?(书中答

求子数组和最大值拓展

题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的. 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 我的组员是朱少辉,我负责代码复审和代码测试. 设计思想:将数组长度范围扩大能够处理1000个数,而Int32 值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间的有符号整数,当大于该

二维数组子数组的最大值之和

题目:求一个二维数组中其子数组之和的最大值. 人员: 陈晨:负责程序编写. 王颖瑞:负责代码复审和代码测试. 思路:对于求二维数组的子数组之和,思路和求一维数组的相差不多,但需要分析更多的情况,我跟舍友讨论之后,之后写的.以下是我的思路: 1.确定子数组的最大上界,从第一行依次向下,规定最大子数组的范围. 2.对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行.(如第一组只有一行,第二组有两行等,列数和数组的列数相同) 3.对于第二步产生的几个数组,进行一维数组求子数组

[编程之美] 2.14 求数组的子数组之和的最大值

问题描述:给定一个包含N个整数的数组,求数组的子数组之和的最大值. 这是递归和贪心策略的一个经典问题.现在,对这个问题进行一下总结. 1 明确题意 题目中的子数组要求是连续的,也就是数组中的某个连续部分. 如果数组中都是正整数,直接相加就行.因此,主要是要考虑负数的情况. 2 直接求所有的子数组和 最简单且容易理解的解法是求出所有的子数组和,然后保存最大的和. int MaxSum(int *A, int n) { int maximum = -INF; int sum = 0; int i =

输入一组整数,求子数组和的最大值。(数组进行首尾相接之后)

输入一组整数,求子数组和的最大值. 题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. ? 10 -9 8 7 -5 3 ? i : 4 3 2 1 0 ? nALL : 3 3 7 15 15 16 ? nStart: 3 -2 7 15 6 16 ? nStart = max(arr[i], arr[i]+

求子数组的最大和 【微软面试100题 第三题】

题目要求: 输入一个整型数组,数组里有整数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有个一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 例如:输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18. 参考资料:剑指offer第31题.编程之美2.14. 题目分析: 依次读入数组值,采用两个临时变量 maxSum:保存当前数组元素之前的子数组的最大值: maxEndingHere:包含当前元素前一

编程之美 2.14求数组的子数组之和的最大值

对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值. 如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. 方法一:暴力 循环遍历,输出所有,判断最大的和 1 #include"iostream" 2 #define MAX 1001 3 using namespace std; 4 5 int main(){ 6 int n, a[MAX], sum , maxsum ; 7 8 cin &