微软面试题解题笔记——求子数组的最大和

来源:互联网 发布:c语言数组转字符串 编辑:程序博客网 时间:2024/05/16 00:44

(题目来源于July的整理,十分感谢。July博客地址:http://blog.csdn.net/v_JULY_v。 本文后面附上了July整理提供的答案。小生刚开始学写博客,加上才疏学浅。所以文中错误和不足期望大家指正。可以点此去测试代码

3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

===========================================================================================

    题目看似很复杂,要在一串数字中找到一个子串使其和最大。要求算法复杂度为O(n),大概意思就是要求将这串数字遍历一次便能找到这个这个字串的最大和。
    我们有两个变量一个存放当前状态下找到的最大子串和,我们称其为全局子串和,其初始值是数组第一个元素。另一个存放局部子串的和。所谓局部子串是每个值得考虑的子串。问题的关键也就是确定这个子串的开始点以及其到什么时候结束。
    我们假设第一个局部子串从第一个元素开始也终止于第一个元素。那么当前局部子串最大和就是第一个元素。我们逐步扩大这个子串。每扩大一个数字都将当前我们选择的局部子串的和与历来最优的子串和做对比看那个最优。这里最重要的一点,如果当前局部子串和为负数的话,我们要重新选择局部字串的开始点。因为负的子串和再加上其他数字只会带来负增益。所以我们要舍弃以前的字串重新找个字串直到他为正增益为止。
    其中有种特殊情况如果数组中全是负数,那么局部字串将永远找不到一个合适的开始点。不过题目已经说明数组中既有负数也有正数,所以这种情况不会出现。万一出现了也不会影响题目最终结果,因为我们每扩大一个数字都会与全局字串最大和对比。这时最大子串是数组中最小元素。
   我知道我说的很不清楚,但July提供的代码是最清楚的。简洁的叫人窒息。也许是“大道至简”吧。惭愧惭愧啊。。。

拓展阅读:贪心算法

===========================================================================================

July提供的答案(July博客地址:http://blog.csdn.net/v_JULY_v):

//July 2010/10/18#include <iostream.h>int maxSum(int* a, int n){int sum=0;int b=0;for(int i=0; i<n; i++){if(b<0)b=a[i];elseb+=a[i];if(sum<b)sum=b;}return sum;}int main(){int a[10]={1,-8,6,3,-1,5,7,-2,0,1};cout<<maxSum(a,10)<<endl;return 0;}


===========================================================================================

我的代码贴在这里示众并以此自省:

#include <iostream>using namespace std;int main(){int a[] = {1,-2,3,10,-4,7,2,-5};int nSize = sizeof(a)/sizeof(int);int nCurMax = a[0],nBest = a[0];int count = 0;nCurMax = nBest = a[0];while(count < nSize){count++;if (nCurMax <= 0){if (nCurMax < a[count])nCurMax = a[count];}else{if (a[count] > 0 )nCurMax += a[count];else{if(a[count]+nCurMax > 0)nCurMax += a[count];else{if (nCurMax > nBest)nBest = nCurMax;nCurMax = a[count];continue;}}}if (nCurMax > nBest){nBest = nCurMax;}}cout<<nBest<<endl;return 0;}

原创粉丝点击