(剑指Offer)面试题31:连续子数组的最大和
2015-07-25 09:53
399 查看
题目:
输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)思路:
1、数组累加从头到尾逐个累加数组中的每个数字,当累加之和小于0时,从下一个元素开始累加,并通过一个变量保存最大和。
2、动态规划
思路与1一样,假设f(i)为以第i个数字结尾的子数组的最大和,那么
f(i)=A[i], f(i-1)<=0
f(i)=f(i-1)+A[i],f(i-1)>0
初始状态:f(0)=A[0]
最后求max(f(i)).
代码:
1、数字累加#include <iostream> using namespace std; bool g_InvalidInput=false; int findGreatestSumOfSubArray(int *pData,int nLength){ if(pData==NULL || nLength<=0){ g_InvalidInput=true; return 0; } g_InvalidInput=false; int nCurSum=0; int nGreatestSum=0x80000000; for(int i=0;i<nLength;i++){ if(nCurSum<=0) nCurSum=pData[i]; else nCurSum+=pData[i]; if(nCurSum>nGreatestSum) nGreatestSum=nCurSum; } return nGreatestSum; } int main() { int A[]={1,-2,3,10,-4,7,2,-5}; int len=sizeof(A)/sizeof(A[0]); cout << findGreatestSumOfSubArray(A,len) << endl; return 0; }
2、动态规划
#include <iostream> using namespace std; bool g_InvalidInput=false; int findGreatestSumOfSubArray_DP(int *pData,int nLength){ if(pData==NULL || nLength<=0){ g_InvalidInput=true; return 0; } g_InvalidInput=false; int nCurSum[nLength]; int nGreatestSum=0x80000000; nCurSum[0]=pData[0]; for(int i=1;i<nLength;i++){ if(nCurSum[i-1]<=0) nCurSum[i]=pData[i]; else nCurSum[i]=nCurSum[i-1]+pData[i]; if(nCurSum[i]>nGreatestSum) nGreatestSum=nCurSum[i]; } return nGreatestSum; } int main() { int A[]={1,-2,3,10,-4,7,2,-5}; int len=sizeof(A)/sizeof(A[0]); cout << findGreatestSumOfSubArray_DP(A,len) << endl; return 0; }
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/459bd355da1549fa8a49e350bf3df484?rp=2AC代码:
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { unsigned length=array.size(); if(length<=0) return 0; int curSum=0; int greatestSum=0x80000000; for(unsigned int i=0;i<length;i++){ if(curSum<=0) curSum=array[i]; else curSum+=array[i]; if(curSum>greatestSum) greatestSum=curSum; } return greatestSum; } };
相关文章推荐
- 剑指Offer面试题5(Java版):从尾到头打印链表
- 黑马程序员——Java IO总结一
- 程序员,为什么千万不要重写代码?
- 关于“构造函数”中的几个小问题,也许面试会问到哦~
- 神奇的decimal,也许面试会问到哦~
- 【黑马程序员】----java基础---反射
- 黑马程序员——Java基础-异常
- 【LeetCode-面试算法经典-Java实现】【029-Divide Two Integers(两个整数相除)】
- 【LeetCode-面试算法经典-Java实现】【028-Implement strStr() (实现strStr()函数)】
- 【LeetCode-面试算法经典-Java实现】【027-Remove Element(删除数组中指定的元素)】
- 程序员,为什么千万不要重写代码?
- Two Sigma面试专题
- 阿里电话面试问题----100万个URL如何找到出现频率最高的前100个?
- 黑马程序员--面向对象02
- 【面试加分项】java自定义注解之申明注解
- 第一次使用拉勾网求职经历
- 全面解析《嵌入式程序员应该知道的16个问题》
- 出来行迟早是要还的(篇四):游戏开发离职日志和面试日志
- 程序员技术练级攻略(转)
- 黑马程序员--面向对象01