博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美2.14 求数组的子数组之和的最大值
阅读量:4485 次
发布时间:2019-06-08

本文共 1420 字,大约阅读时间需要 4 分钟。

      这是一个在面试中出现概率非常高的一道题目,就拿我来说吧,面试了5家公司中。两家公司问了这道题目。可见,这道题目是非常经典的。

      解题思想也不是非常难。我熟悉的有;两种解题办法:

      1. 一直连加。终止当前序列的条件是连加的和是负数

      由于,一个数加上一个负数之后肯定是没有原来的数值大,所以。这肯定是没有意义的,终于。我们利用这个思想得到例如以下的解法。

      函数声明:

ll DutMaxSeqSubArray_1(int*, int);

typedef long long ll;

      源码:

/*非经常见的最大连续子数组的解法*/bool _DutMaxSeqSubArray = false;ll DutMaxSeqSubArray_1(int* A, int size){	if (!A || size <= 0)	{		_DutMaxSeqSubArray = true;		return -1;	}	ll result = 1 << 31;	ll currentSum = 0;	/*循环走一遍数组。遇到加和为负数时就開始下一轮加和*/	for (int i = 0; i < size; ++i)	{		if (currentSum <= 0)			currentSum = A[i];		else			currentSum += A[i];		if (result < currentSum)			result = currentSum;	}	return result;}

      2. 动态规划的思想:连续子数组最大和也一定是以某一个值结尾

      不管连续子数组有几个数,也不论和是多大。它总是以一个数结束的,而那个数肯定也是出如今数组中,所以,能够得到例如以下的递推公式: 

      以当前数结尾的最大连续子数组之和是:

      pData[i] = pData[i - 1] + A[i] || A[i]

      所以,能够得到例如以下的解法:

      函数声明:

ll DutMaxSeqSubArray_2(int*, int);

      源码:

/*动态规划的解法*/ll DutMaxSeqSubArray_2(int* A, int size){	if (!A || size <= 0)	{		_DutMaxSeqSubArray = true;		return -1;	}	ll result = 1 << 31;	ll currentSum = 0;	for (int i = 0; i < size; ++i)	{		/*		 *思想是,最大连续子数组肯定是以某一个数组元素结尾的。所以,		 *依照那个数字结尾时的最大加和就能够求得整个		 *数组的最大连续之和		 */		currentSum = DutMax
(currentSum + A[i], A[i]); result = DutMax
(result, currentSum); } return result;}

      用到的模板函数:

template 
T DutMax(T data1, T data2){ return data1 > data2 ? data1 : data2;}

转载于:https://www.cnblogs.com/mengfanrong/p/5347902.html

你可能感兴趣的文章
JSP
查看>>
Time, Clocks, and the Ordering of Events in a Distributed System
查看>>
C#成员基础
查看>>
字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
查看>>
为Azure Web Site 添加ADFS验证支持之二 在代码里使用ADFS
查看>>
day1--计算机基础1
查看>>
phpStudy
查看>>
编程珠玑——第一章习题
查看>>
mapper.xml文件中标签不显示问题
查看>>
JavaScript的事件
查看>>
ios中实现对UItextField,UITextView等输入框的字数限制
查看>>
PAT Basic 1008
查看>>
[Information Theory] L1: Introduction to Information Theory
查看>>
相册分类列表页
查看>>
各浏览器的鼠标位置测试
查看>>
[BZOJ1070][SCOI2007]修车(最小费用最大流)
查看>>
python字节码(转)
查看>>
[bzoj 2151]种树(贪心)
查看>>
js函数
查看>>
Unity3D 之UGUI 图片
查看>>