(剑指Offer)面试题31:连续子数组的最大和
题目:
输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为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=2
AC代码:
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)面试题31:连续子数组的最大和的更多相关文章
- 剑指offer面试题31连续子数组的最大和
一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...
- 剑指 offer 面试题31 连续子数组的最大和(动态规划)
求连续子数组的最大和 题目描述 给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n); 测试用例 给定数组 {1,-2,3,10,- ...
- 剑指Offer:面试题31——连续子数组的最大和(java实现)
问题描述 : 输入一个整数数组,数组里面有正数也有负数.数组中一个或连续几个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路1:常规解法,不知道怎么描述了.. 代码: bo ...
- 【剑指Offer】30、连续子数组的最大和
题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是 ...
- 剑指offer三十之连续子数组的最大和
一.题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 剑指offer(30)连续子数组和的最大值
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 【剑指offer】Q31:连续子数组的组大和
简短的分析见:http://blog.csdn.net/shiquxinkong/article/details/17934747 def FindGreatestSumOfSubArray(arra ...
- 【剑指offer】面试题 42. 连续子数组的最大和
面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1 ...
- leetcode面试题42. 连续子数组的最大和
总结一道leetcode上的高频题,反反复复遇到了好多次,特别适合作为一道动态规划入门题,本文将详细的从读题开始,介绍解题思路. 题目描述示例动态规划分析代码结果 题目 面试题42. 连续子数 ...
- C++版 - 剑指offer 面试题31:连续子数组的最大和 题解
剑指offer:连续子数组的最大和 提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&am ...
随机推荐
- NetBeans-xdebug的安装
如果总是提示正在连接,ok,应该是没有装xdebug; 1,下载Php版本对应的xdebug.dll文件,以下是官方提供的网址,可以智能判断环境,给出下载链接和使用指南 http://www.xdeb ...
- 别人的的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- MYSQL中 ENUM、SET 类型(建议用tinyint代替)
ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串("") 或 NULL: 如果 ...
- XSS 前端防火墙(1):内联事件拦截
关于 XSS 怎样形成.如何注入.能做什么.如何防范,前人已有无数的探讨,这里就不再累述了.本文介绍的则是另一种预防思路. 几乎每篇谈论 XSS 的文章,结尾多少都会提到如何防止,然而大多万变不离其宗 ...
- C++中,申请字符串数组可用new实现
C++中,申请字符串数组可用new实现: char ** list = new char*[MAX_NUM]; for (int i = 0; i< MAX_LOOP; i++) list[i] ...
- C#调用其它语言(例如C++)DLL文件中函数的方法摘要
有托管和非托管的概念没仔细看,接下来记录的引用Dll文件指的是无法通过VS自动完成添加引用的情况,可以使用如下方法: 步骤一: 打开“Visual Studio Tools”的“命令提示符”工具 使用 ...
- Java线程同步_1
Java线程同步_1 synchronized 该同步机制的的核心是同步监视器,任何对象都可以作为同步监视器,代码执行结束,或者程序调用了同步监视器的wait方法会导致释放同步监视器 synchron ...
- fopen警告处理方式
warning C4996: “fopen”被声明为否决的 问题:vs2005中编程时,遇到如下: warning C4996: “fopen”被声明为否决的. 解释:微软的警告,主要是那些都是C库的 ...
- fork()函数
现代操作系统提供的三种构造并发程序的方法: •进程 一个进程实体包括:代码段,数据段, 进程控制块 fork()函数:通过系统调用创建一个与原来一模一样的子线程,[用来处理请求信号,而父进程继续一直处 ...
- WS之cxf简单实现
1.服务端实现: 1.1 定义接口,用@WebService修饰: /** @WebService 所修饰的接口,那么接口里面的方法全部都属于web的服务 */ @WebService public ...