微软面试题解题笔记——求子数组的最大和
来源:互联网 发布: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;}
- 微软面试题解题笔记——求子数组的最大和
- 3 微软面试题:求子数组的最大和,并找出此子数组
- 微软,Google面试题 (3) —— 求最大子数组和
- 微软面试题系列:求子数组最大和
- 程序员面试题100题第03题——求子数组的最大和
- 面试题2:求子数组的最大和
- 面试题 31: 求子数组的最大和
- 面试题10-- 求子数组的最大和
- 面试题五:求子数组的最大和
- 面试题05:求子数组的最大和
- 微软面试题---求子数组最大乘积问题
- 面试题31—连续子数组的最大和
- 面试题(2)——求子数组最大和
- 程序员面试题精选100题(03)-求子数组的最大和—python实现
- 经典面试题之求连续子数组最大和
- 淘宝2013面试题-求首尾相连数组的最大子数组和
- [经典面试题][淘宝]求首尾相连数组的最大子数组和
- 剑指offer面试题 求数组中连续子数组的最大和
- 两个在存储方面的用到的函数
- HDU 1085
- jquery博客收集的IE6中CSS常见BUG全集及解决方案
- [转]这个新闻故事也太神奇了,很吸引人,都不像是新闻了
- editplus支持RUBY和运行
- 微软面试题解题笔记——求子数组的最大和
- 外包对软件行业的影响
- 用JSON和XML方法解析查询城市的天气情况
- c++虚函数,拳击游戏实例
- Mystery of the Ancients Curse of the Black Water Collectors Edition v1 01-TE
- SystemVerilog VMM Workshop Lab Guide(LG)学习笔记-Lab2 VMM Transaction & Atomic Generator
- 跟燕十八学习PHP-第二十九天-MySQL数学函数与字符串
- 决不应该调用CreateThread
- JSONObject.fromObject(map)(JSON与JAVA数据的转换)