前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++版 - 剑指offer 面试题31:连续子数组的最大和 题解

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

作者头像
Enjoy233
发布2019-03-05 14:11:16
5130
发布2019-03-05 14:11:16
举报
文章被收录于专栏:大白技术控的技术自留地

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

提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183

参与人数: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代码:

代码语言:javascript
复制
#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>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年04月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档