【剑指offer】Q31:连续子数组的组大和

简短的分析见:http://blog.csdn.net/shiquxinkong/article/details/17934747

def FindGreatestSumOfSubArray(array, index = None):
	curSum = 0
	maxSum = 0
	#return maxSum without the start and end index
	if index == None:
		for x in array:
			curSum = max(curSum, 0)
			curSum += x
			maxSum = max(maxSum, curSum)
		return maxSum
	#return maxSum and the start and end index
	else:
		curS = -1
		curE = -1
		maxS = -1
		maxE = -1
		for i in range(len(array)):
			if curSum <= 0:
				curSum = array[i]
				curS = i
				curE = i
			else:
				curSum += array[i]
				curE = i
			if curSum > maxSum:
				maxS = curS
				maxE = curE
				maxSum = curSum
		return maxSum, maxS, maxE

这里通过index參数重载了两个版本号,一个只返回最大子段和,但有的时候我们可能还被要求返回取得最大子段和的起始区间。

上面的代码尽管看起来不像动态规划,可是思想确实是dp的思想。

时间: 2024-10-08 18:26:27

【剑指offer】Q31:连续子数组的组大和的相关文章

剑指Offer:连续子数组的最大和

题目: 输入一个整型数组, 数组里有正数也有负数. 数组中的一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值. 要求时间复杂度为O(n) #include <stdio.h> int maxsum_subarray(int a[], int n) { if( a==NULL || n<=0 ) { printf("Error.\n"); return 0x80000000; } int i; int curmax = 0x80000000; int cu

【剑指Offer】连续子数组的最大和

问题描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 算法分析 有一个temp用于探路,sum负责保存最终值,初始都为数组第一个数: 每一轮循环里, temp如果小于

【剑指offer】连续子数组最大和

思路dp很清楚,就是要注意细节. int FindGreatestSumOfSubArray(vector<int> array) { if(array.empty()) return 0; int sum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止只有负数 for(int i = 1; i < array.size(); i++) //从1开始 因为0的情况在初始化时完成了 { tempsum = (tempsum < 0)

剑指offer30:连续子数组的最大和

1 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1). 2 思路和方法, C++核心代码 2.1

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

【剑指offer】和为定值的连续正数序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27823291 题目描写叙述: 小明非常喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他立即就写出了正确答案是100.可是他并不满足于此,他在想到底有多少种连续的正数序列的和为100(至少包含两个数).没多久,他就得到还有一组连续正数和为100的序列:18,19,20,21,22.如今把问题交给你,你能不能也非常快的找出全部和为S的连续正数序列? Good Luck! 输入:

C++中求数组连续子向量的最大和(牛客剑指offer)

/////////////////////////////////////////////////////////////////// //HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学. //今天测试组开完会后,他又发话了:在古老的一维模式识别中, //常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决. //但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? //例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开

【剑指offer】Q41:和为s的连续正数序列

def sumS(s): if s <= 0: return re = [] first = 1; last = 2; cursum = first + last while first <= s >> 1: if cursum < s: last += 1 cursum += last else: if cursum == s: re.append((first, last)) cursum -= first first += 1 return re [剑指offer]Q4

C++输出所有和为S的连续正数序列(牛客剑指offer)

////////////////////////////////////////////////////////////////////////// //小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和, //他马上就写出了正确答案是100. //但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数). //没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22. //现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?

剑指OFFER 连续数组的最大和

剑指OFFER 连续数组的最大和 经典的动态规划题 其思路是把所有的和都算出来,当然不能简单粗暴的直接相加,要利用上一次计算出的结果加速第二次的运算 class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int size = array.size(); int max = INT_MIN; //dp 数组初始化,dp[i][j]表示从i到j的和,例如dp[0][1]表示array[0]+array