剑指offer:连续子数组的最大和



参与人数:2845  时间限制:1秒   空间限制:32768K
本题知识点:数组


题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

分析:
方法1:条件累加(时间复杂度O(n))

用currentSum记录当前数的和,用maxSum来保存功能函数FindGreatestSumOfSubArray整个过程中的最大和,将maxSum初始化为最小的负整数。如果当前和currentSum<0,则将currentSum置为0,以紧跟的那个数为第一个开始累加,如果currentSum>maxSum,将maxSum置为currentSum,当然若currentSum=0,此时不操作 等价于置为0.

另外,此题中要求输入为[](即输入向量array的长度为0)时,需要返回0,这点需要注意一下.

方法2:动态规划

方法1

AC代码:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
if(array.size()==0) return 0; // 输入向量的元素为空,输入无效
int maxSum = -1<<31; // int maxSum = INT_MIN; 用来保存最大和,初始化为最小的负整数,剑指offer原书上用的16进制带符号的0x80000000表示最小的负整数,不易理解,C++中有相应的常量INT_MIN
int currentSum = 0;
for(int i=0;i<array.size();i++)
{
currentSum += array[i];
if(currentSum > maxSum)
maxSum = currentSum; // 将最大和更新为当前和
if(currentSum < 0)
currentSum = 0;
}
return maxSum;
}
};
// 以下为测试部分
/*
int main()
{
vector<int> vec={2,-3,5,-6,10,20}; // vector<int> vec={}; 向量直接赋值的方法C++11标准支持,编译器如果比较旧需要先写数组或迭代器,然后以相关元素创建数组
Solution sol;
cout<<sol.FindGreatestSumOfSubArray(vec)<<endl;
return 0;
}
*/

注: INT_MIN和INT_MAX在C语言limits.h中定义,而float.h 定义了double、float类型数的最大最小值,本地测试需要#include<limits.h>

C++版 - 剑指offer 面试题31:连续子数组的最大和 题解的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. C++版 - 剑指offer 面试题5:从尾到头打印链表 题解

    面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tq ...

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

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

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

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

随机推荐

  1. ContentType与SpiringMvc

    转载https://blog.csdn.net/mingtianhaiyouwo/article/details/51459764

  2. (转)MySql中监视增删改查和查看日志记录

    转载地址为:http://blog.51cto.com/hades02/1641652 首先在命令行输入 show global variables like '%general%' ,然后出现下面的 ...

  3. JSOI2018 简要题解

    潜入行动 复杂度分析题. 定义状态fi,j,0/1,0/1f_{i,j,0/1,0/1}fi,j,0/1,0/1​表示以iii为根子树放jjj个机器iii这个放不放,iii这个是否已放来进行dpdpd ...

  4. linux 环境统配

    #java JAVA_HOME=/opt/jdk CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME C ...

  5. 基于UML网络教学管理平台模型的搭建

    一.基本信息 标题:基于UML网络教学管理平台模型的搭建 时间:2013 出版源:网络安全技术与应用 领域分类:UML:网络教学管理平台:模型 二.研究背景 问题定义:网络教学管理平台模型的搭建 难点 ...

  6. app -webkit-box-orient: vertical 打包后不显示

    先说明问题是什么: -webkit-box-orient: vertical 这个属性在本地运行调试是存在的,但是打包后这个属性消失了: 解决办法: 1.将-webkit-box-orient: ve ...

  7. GC算法基础

    寻找垃圾对象的算法:1. 引用计数(无法处理循环引用) 2. 根寻法(被广泛引用在gc算法中) 清理垃圾的算法: 1. 标记复制  2. 标记清理  3. 标记整理 分代算法的好处: 1. 分代处理, ...

  8. 基于MFC的socket编程

    网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...

  9. 1.1.5 PROB Friday the Thirteenth

    Friday the Thirteenth Is Friday the 13th really an unusual event? That is, does the 13th of the mont ...

  10. WSGI and Paste学习笔记

    The Problem Lots of web frameworks Zope, Quixote, Webware, SkunkWeb and Twisted Web etc Applications ...