【Data Structure & Algorithm】求子数组的最大和
求子数组的最大和
题目:输入一个整型数组,数组里有正数和负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,要求时间复杂度为O(n)。例如输入数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
分析:如果不考虑时间复杂度,可以枚举出所有子数组并求其和。但是由于长度为n的数组有O(n2)个子数组;且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。
其实,当加上一个正数时,和会增加;当加上一个负数时,和会减少。如果当前得到的和是一个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然这个负数将会减少接下来的和。
boolFind GreatestSumOfSubArray (int *pData, unsigned int nLength, int &nGreatestSum)
{
if ((pData ==NULL) || (nLength ==0))
return false;
int nCurSum = nGreatestSum = 0;
for (unsigned int i=0; i < nLength;++i)
{
nCurSum += pData[i]; //if the current sum is negativediscard it
if (nCurSum < 0)
nCurSum = 0; //if a greater sum is found,update the greatest sum
if(nCurSum > nGreatestSum)
nGreatestSum = nCurSum;
} //if all data are negative, find thegreatest element in the array
if (nGreatestSum == 0)
{
nGreatestSum= pData[0];
for(unsignedint i=1; i<nLength; ++i)
{
if(pData[i]> nGreatestSum)
nGreatestSum= pData[i];
}
}
return true;
}
函数的返回值不是子数组和的最大值,而是一个判断输入是否有效的标志,如果函数返回值的是子数组和的最大值,那么当输入一个空指针应该返回何值?如果返回0,那这个函数的用户怎么区分输入无效和子数组的最大值刚好是0这两种情况?基于上述考虑,应该把子数组和的最大值以引用的方式放到参数列表中,同时让函数返回一个函数是否正常执行的标志。
输入有一类特殊情况需要特殊处理,当输入数组中所有整数都是负数时,子数组和的最大值就是数组中最大元素。
【Data Structure & Algorithm】求子数组的最大和的更多相关文章
- 【算法Everyday】第二日 求子数组的最大和
题目 // 3.求子数组的最大和 // 题目: // 输入一个整形数组,数组里有正数也有负数. // 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. // 求所有子数组的和的最大值. ...
- 求子数组的最大和要求O(n)
//求子数组的最大和 //输入一个整形数组.有整数也有负数,数组中连续一个或多个子数组,每一个子数组都有一个和,求全部子数组的和的最大值,要求时间复杂度O(n) #include<iostrea ...
- 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
主要讲第五课的内容前缀树应用和第六课内容暴力递归改动态规划的最全步骤 第一题 给定一个数组,求子数组的最大异或和. 一个数组的异或和为,数组中所有的数异或起来的结果. 简单的前缀树应用 暴力方法: 先 ...
- Task 4 求数组的连续子数组的最大和(团队合作)
小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...
- 剑指Offer面试题:28.连续子数组的最大和
一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...
- 《剑指offer》第四十二题(连续子数组的最大和)
// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整 // 数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). #in ...
- 剑指 offer 面试题31 连续子数组的最大和(动态规划)
求连续子数组的最大和 题目描述 给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n); 测试用例 给定数组 {1,-2,3,10,- ...
- 【剑指Offer学习】【面试题31:连续子数组的最大和】
题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求全部子数组的和的最大值.要求时间复杂度为O(n). 样例说明: 比如输入的数组为{1, -2, 3, 10, ...
- 剑指Offer:面试题31——连续子数组的最大和(java实现)
问题描述 : 输入一个整数数组,数组里面有正数也有负数.数组中一个或连续几个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路1:常规解法,不知道怎么描述了.. 代码: bo ...
随机推荐
- Ubuntu 登陆异常-输入正确的密码后还会返回到登陆界面的问题
问题表现: 启动到了登陆界面,输入对应的密码,发现一闪黑屏有返回到登陆界面,如此往复. 解决方法: 开机后在登陆界面按下shift + ctrl + F1进入tty命令行终端登陆,可以查看用户主目录下 ...
- (总结)Nginx配置文件nginx.conf中文具体解释
#定义Nginx执行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...
- alexNet--deep learning--alexNet的11行代码
% Copyright 2016 The MathWorks, Inc. clear camera = webcam( 2 ); % Connect to the camerannet = ale ...
- PS 魔法棒
魔术棒工具是通过选取图像中颜色相近或大面积单色区域的像素来制作选区,魔术棒用于纯色背景中较多. 容差数值越大,选择出的选区就越大,容差越小,对颜色差别的要求也就越严格,选择出的选区也就越小 按住shi ...
- 学习某些API的方法
学习某些 API 的方法 这里的 API 可能是某个系统平台,开发包,开发平台,开发工具等等,因为任何系统和技术方法提供给开发者的打包方式都是一系列 API . 无论你有在哪一层级开发,从硬件驱动到系 ...
- css3-calc用法
css3--calc()使用 css3新增的一个功能,可以计算元素的长度 例如说:一个百分百布局中,分左右两侧,中间需要一个分隔空间,使用padding或者margin则会超出100%,这时候使用ca ...
- mysql user password plugin
caching_sha2_passwordcaching_sha2_passwordcaching_sha2_passwordcaching_sha2_passwordcaching_sha2_pas ...
- react面试宝典
调用 setState 之后发生了什么? 在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation).经过调和过程 ...
- linux iptables:安全应用,防火墙
iptables:安全应用,防火墙 windows和linux都有防火墙,企业的边缘会部署防火墙保证企业内部的局域网是安全的.针对个人电脑会有防火墙保证系统是安全的. 防火墙是唯一通道. 防火墙分类( ...
- 10.19-10.20 test
2016 10.19-10.20 两天 题目by mzx Day1: T1:loverfinding 题解:hash #include<iostream> #include<cst ...