`
chriszeng87
  • 浏览: 741323 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)

 

例子:有数组( -2, 5, 3, -6, 4, -8, 6),则其子数组之和的最大值为8,其对应的数组为(5,3)

 

《编程之美》最后给出了一个时间复杂度为O(n)的算法,实现的代码如下:

 

#include <stdio.h>

int maxSubSum(int* array, int length) {
	int nAll = array[length -1];
	int nStart = array[length-1];
	int i;
	for( i = length-2; i>=0; i--) {
		if(nStart < 0)
			nStart = 0;
		nStart += array[i];
		if(nStart > nAll) //若当前子数组之和大于nAll,则更新nAll
			nAll = nStart;
	}
	return nAll;
}

int main() {
	int a[7] = {-2,5,3,-6,4,-8,6};
	int maxSub = maxSubSum(a,7);
	printf("Max sub sum = %d\n",maxSub);
}

 

其中nAll保存当前的最大子数组之和,先定义初值为最后一个元素,

nStart保存当前的子数组之和,若为负数(最大和的子数组不可能包含当前子数组),则在下次遍历时清零,重新寻找最大和的子数组

分享到:
评论
9 楼 liguocai2009 2012-06-13  
我搞错了。。。
这条题目我刚开始想的是知道a[0]..a[i]子数组的最大值,推导出a[0]...a[i+1]子数组最大值,推导的关键是判断下面3者谁是最大值,最大值的那个就是a[0]...a[i+1]的子数组最大值
a[0]...a[i]的子数组最大值 + a[i+1]
a[i+1]
a[ a[0]...a[i]的最大值子数组的起始index ] 到 a[i+1]的和

这个算法是 O(n*n)。

看了看博文,发现博文是利用了数学,轻松地解决了问题...思路上的根本差别是,我是想由n推出n+1,而博文是利用数学规律
if c>=0
  a+c > a
else if c<0
  a+c <a




8 楼 liguocai2009 2012-06-13  
lagrangee 写道
david.org 写道
楼主正解,不过这题要是要求记录数组位置的话,估计就做不到 O(N) 的时间复杂度了


通过 if(nStart > nAll)  可以确定端点k,  获取nAll后从端点k顺序相加直到和等于nAll 还是O(n)

要位置的话仍然是O(n)啊。。。
7 楼 liguocai2009 2012-06-13  
这一题有一个非常重要的前提。。。最小值是0。。。否则怎么想都是o(n*n)
6 楼 lagrangee 2012-03-30  
david.org 写道
楼主正解,不过这题要是要求记录数组位置的话,估计就做不到 O(N) 的时间复杂度了


通过 if(nStart > nAll)  可以确定端点k,  获取nAll后从端点k顺序相加直到和等于nAll 还是O(n)
5 楼 david.org 2011-06-21  
楼主正解,不过这题要是要求记录数组位置的话,估计就做不到 O(N) 的时间复杂度了
4 楼 minipenguin 2011-06-03  
动态规划,从数组的一端开始遍历,遇到负数则置0,否则求和,遍历完答案就出来了
3 楼 chriszeng87 2011-05-29  
<div class="quote_title">Hmily49 写道</div>
<div class="quote_div">
<div class="quote_title">seedjyh 写道</div>
<div class="quote_div">
<p>典型的DP</p>
<p>计算从最左端到当前位置中最大和以及最小和,两者数列的右端点就是答案了~</p>
</div>
<br>可以说详细点么?</div>
<p>同问</p>
2 楼 Hmily49 2011-05-29  
<div class="quote_title">seedjyh 写道</div><div class="quote_div"><p>典型的DP</p>
<p>计算从最左端到当前位置中最大和以及最小和,两者数列的右端点就是答案了~</p></div><br/>可以说详细点么?
1 楼 seedjyh 2011-05-13  
<p>典型的DP</p>
<p>计算从最左端到当前位置中最大和以及最小和,两者数列的右端点就是答案了~</p>

相关推荐

    如何求连续几个数之和的最大值

    (注:这两天看《编程之美》,发现2.14节,求数组的子数组之和的最大值,跟这个题十分相似,但是没有要求求出开始喝结束的位置,只要求求出最大值,解题思路跟下面的代码相似,但只用了两个变量,没有用数组,做到...

    matlab命令大全

    - **选择性结果**:如`max`、`min`函数可以返回最大值及其索引。 - **数组输入**:许多函数支持数组作为输入参数。 - **2.11 画图入门** - **简单xy绘图**:使用`plot`函数绘制二维曲线图。 - **打印图象**:...

    中文版Excel.2007高级VBA编程宝典.part1

     7.6.1 窗口的最小化和最大化  7.6.2 VBA代码的存储  7.6.3 VBA代码的输入  7.7 VBE环境的定制  7.7.1 使用“编辑器”选项卡  7.7.2 使用“编辑器格式”选项卡  7.7.3 使用“通用”选项卡  7.7.4 使用“可...

    C 语言 扑克牌小游戏

    - `int list_pri[]`: 需要查找最大值的数组。 #### 2.11 `ai_turn0` 函数 - **功能**: AI的初始回合逻辑。 - **参数**: - `int player2[]`: AI玩家的手牌数组。 - `int *count_temp`: 指向当前可用牌数的指针。 ...

    C语言入门经典(第4版)--源代码及课后练习答案

     本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一,在世界范围内广受欢迎,口碑极佳。  本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介  本书是...

    上海交大ACM-ICPC模板

    它可以分为最大堆和最小堆两种,其中最大堆的每个节点的值都不小于其子节点的值,而最小堆则相反。二叉堆广泛应用于各种排序算法以及图论中的最短路径算法。 **1.6 胜者树** 胜者树是一种特殊的树形结构,主要用于...

    java自学之道

    2.10 求主对角线之和 2.11 完数求解 2.12 求s=a+aa+aaa+aaaa+aa...a的值 2.13 高度计算 2.14 乘法口诀 2.15 无重复三位数 2.16 菱形打印 2.17 利润计算 2.18 第几天判断 2.19 从小到大输出数列 2.20 猴子吃桃问题 ...

    4747 Java语言程序设计(一)

    - 完全数是指该数等于其所有真因数之和。 - 示例代码:遍历每个数,找到所有真因数,累加并判断是否等于原数。 **2.7 输入正实数x,求平方不超过x的最大整数n** - 示例代码:使用循环结构,逐步增加n的值,直到n的...

    Visual C++ 程序开发范例宝典光盘源码 (第二版)1/7

     2.14 控件数组典型实例   实例102 向窗体中动态添加控件   实例103 公交线路模拟  第3章 图形技术  第4章 多媒体技术  第5章 文件系统  第6章 操作系统与Windows相关程序  第7章 注册表  第8章...

Global site tag (gtag.js) - Google Analytics