剑指Offer面试题:28.连续子数组的最大和
一、题目:连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。
这个题目在我去年参加校园招聘时,某公司的二面采用了机试,而题目刚好就是这道题。一般看到这道题目就会想到枚举出数组的所有子数组并求出它们的和。一个长度为n的数组,总共有n(n+1)/2个子数组。计算出所有子数组的和,最快也需要O(n2)的时间。但是最直观的方法不会是最优的解法,因此面试官不会满意这样的思路。
二、解题思路
2.1 核心步骤
Step1.从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestNum=int.MinValue)
Step2.首先加上第一个数字,从第二个数字开始累加,依次将累加和保存到一个临时变量(nCurrSum)中;
Step3.如果当前累加和(nCurrSum)小于0,那抛弃前面的子数组和,从下一个数字开始重新累加;相反,则将当前累加和(nCurrSum)与返回累加和(nGreatestNum)进行比较,如果nCurrSum>nGreatestNum,则更新nGreatestNum。
这样比较进行一次遍历之后,就可以得到最终的最大累加和,时间复杂度是O(n)。下图展示了计算数组{1,-2,3,10,-4,7,2,-5}中子数组的最大和的过程:
2.2 代码实现
/// <summary>
/// 计算连续子数组的最大和
/// </summary>
public static int FindGreatestSumOfSubArray(int[] array, out bool isValidInput)
{
if (array == null || array.Length <= )
{
isValidInput = false;
return ;
} isValidInput = true; int currSum = ;
int greatestSum = int.MinValue; for (int i = ; i < array.Length; i++)
{
if(currSum <= )
{
currSum = array[i];
}
else
{
currSum += array[i];
} if (currSum > greatestSum)
{
greatestSum = currSum;
}
} return greatestSum;
}
三、单元测试
3.1 测试用例
// 1, -2, 3, 10, -4, 7, 2, -5
[TestMethod]
public void GetGreatestNumTest1()
{
int[] data = { , -, , , -, , , - };
bool isValid = true;
int actual = SubArrayHelper.FindGreatestSumOfSubArray(data, out isValid);
if (isValid)
{
Assert.AreEqual(actual, );
}
else
{
Assert.AreEqual(isValid, false);
}
} // 所有数字都是负数
// -2, -8, -1, -5, -9
[TestMethod]
public void GetGreatestNumTest2()
{
int[] data = { -, -, -, -, - };
bool isValid = true;
int actual = SubArrayHelper.FindGreatestSumOfSubArray(data, out isValid);
if (isValid)
{
Assert.AreEqual(actual, -);
}
else
{
Assert.AreEqual(isValid, false);
}
} // 所有数字都是正数
// 2, 8, 1, 5, 9
[TestMethod]
public void GetGreatestNumTest3()
{
int[] data = { , , , , };
bool isValid = true;
int actual = SubArrayHelper.FindGreatestSumOfSubArray(data, out isValid);
if (isValid)
{
Assert.AreEqual(actual, );
}
else
{
Assert.AreEqual(isValid, false);
}
} // 无效输入
[TestMethod]
public void GetGreatestNumTest4()
{
bool isValid = true;
int actual = SubArrayHelper.FindGreatestSumOfSubArray(null, out isValid);
if (isValid)
{
Assert.AreEqual(actual, );
}
else
{
Assert.AreEqual(isValid, false);
}
}
3.2 测试结果
(1)测试用例通过情况
(2)代码覆盖率
剑指Offer面试题:28.连续子数组的最大和的更多相关文章
- 剑指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. 连续子数 ...
随机推荐
- 新浪云SAE搭建python环境 问题拾遗
1.python程序部署到sae上需要做的改动 在线上需要转换成wsgi的形式运行python程序. sae中运行python程序需要指定一个函数为入口函数. application = sae.cr ...
- 【DWR系列02】-DWR逆向Ajax即服务器推送
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
- Ubuntu 搭建SSH服务器
参考地址:https://help.ubuntu.com/community/SSH/OpenSSH/Configuring 配置文件路径:/etc/ssh/ssh_config 和 /etc/ssh ...
- 第三十一篇:SOUI布局之相对于特定兄弟窗口
SOUI中通过pos的标志如:[, {, }, ],这4个标志可以相对于前一个及后一个兄弟窗口,但是有时候希望相对于不是前后窗口的兄弟窗口,比如一个通过一个中心窗口同时定义它的上下左右4个窗口,这个时 ...
- XmlValidationHelper XSD、Schema(XmlSchemaSet)、XmlReader(XmlValidationSettings)、XmlDocument、XDocument Validate
namespace Test { using Microshaoft; using System; using System.Xml; using System.Xml.Linq; class Pro ...
- UWP Composition API - GroupListView(二)
还是先上效果图: 看完了上一篇UWP Composition API - GroupListView(一)的童鞋会问,这不是跟上一篇一样的吗??? 骗点击的?? No,No,其实相对上一个有更简单粗暴 ...
- spin.js
$ajax提交,菊花加载的方式和位置: $.ajax({ type: "get", url: "http://www.xxx.com/test.html", b ...
- iOS之关于开发的那点破事(一)
前言: 前段时间,经理突然找我说:能不能在项目中对缓存的图片进行加密?当时就感到疑惑,就说:可以是可以,但为什么要这样做?有什么意义没? 我们都知道,apple使用的沙盒(sandbox)机制,这种机 ...
- 最详细易懂的CRC-16校验原理(附源程序)(转)
最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...
- selenium:org.openqa.selenium.WebDriverException: f.QueryInterface is not a function
今天用selenium2遇到问题 org.openqa.selenium.WebDriverException: f.QueryInterface is not a function 查了好久最后终于 ...