题目:

输入一个整型数组,数组里有正数也有负数,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为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:连续子数组的最大和的更多相关文章

  1. 剑指offer面试题31连续子数组的最大和

    一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...

  2. 剑指 offer 面试题31 连续子数组的最大和(动态规划)

    求连续子数组的最大和 题目描述 给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n); 测试用例 给定数组 {1,-2,3,10,- ...

  3. 剑指Offer:面试题31——连续子数组的最大和(java实现)

    问题描述 : 输入一个整数数组,数组里面有正数也有负数.数组中一个或连续几个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路1:常规解法,不知道怎么描述了.. 代码: bo ...

  4. 【剑指Offer】30、连续子数组的最大和

      题目描述:   HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是 ...

  5. 剑指offer三十之连续子数组的最大和

    一.题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  6. 剑指offer(30)连续子数组和的最大值

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  7. 【剑指offer】Q31:连续子数组的组大和

    简短的分析见:http://blog.csdn.net/shiquxinkong/article/details/17934747 def FindGreatestSumOfSubArray(arra ...

  8. 【剑指offer】面试题 42. 连续子数组的最大和

    面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1 ...

  9. leetcode面试题42. 连续子数组的最大和

      总结一道leetcode上的高频题,反反复复遇到了好多次,特别适合作为一道动态规划入门题,本文将详细的从读题开始,介绍解题思路. 题目描述示例动态规划分析代码结果 题目   面试题42. 连续子数 ...

  10. C++版 - 剑指offer 面试题31:连续子数组的最大和 题解

    剑指offer:连续子数组的最大和 提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&am ...

随机推荐

  1. 免费的WebService

    天气预报Web服务,数据来源于中国气象局 Endpoint :     http://www.webxml.com.cn/WebServices/WeatherWebService.asmx Disc ...

  2. Java正则表达式之语法规则

    正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理.正则表达式提供了一种 ...

  3. POJ 2249 Binomial Showdown

    // n 个 数 取 k个数的取法// C(n,k) 注意些细节#include <iostream> #include <string> #include<sstrea ...

  4. mysql 查看所有存储过程

    转载地址:http://zhuixue.iteye.com/blog/375353 查询数据库中的存储过程 方法一: select `name` from mysql.proc where db = ...

  5. 浅谈MySQL Replication(复制)基本原理

    1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...

  6. WPF:百度百科

    WPF http://baike.baidu.com/view/292311.htm

  7. 细雨学习笔记:JMeter 的主要测试组件总结

    1. 测试计划是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2. 线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求.实际的请求内容在Sampler中定义, ...

  8. STM32 UART 重映射

    在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内 ...

  9. windows下django1.7 +python3.4.2搭建记录2

    1.自定义页面写一个显示当前时间的页面views.py文件加一个使用模板的模块,整体内容为: #coding=utf-8 from django.shortcuts import render fro ...

  10. SparkR grammer

    They are different between local R and sparkR: sparkR 跑通的函数: http://blog.csdn.net/wa2003/article/det ...