剑指offer面试题31连续子数组的最大和
一、题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
二、解题思路
求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子数组。示例代码:
/*
* 连续子数组的最大和
*/
public class Solution_31
{
public static void main(String[] args)
{
System.out.println(FindGreatestSumOfSubArray(new int[]{ -2, -8, -1, -5, -9 }));
}
public static int FindGreatestSumOfSubArray(int[] array)
{
if(array==null||array.length<=0)
return 0;
int maxSumOfSubArray = Integer.MIN_VALUE;
for (int i = 0; i < array.length; i++)
{
int sum = array[i];
if (sum > maxSumOfSubArray)
{
maxSumOfSubArray = sum;
}
for (int j = i + 1; j < array.length; j++)
{
if (sum + array[j] > maxSumOfSubArray)
{
maxSumOfSubArray = sum + array[j];
}
sum = sum + array[j];
}
}
return maxSumOfSubArray;
}
}
还有一种方法是,扫描一遍数组,并设置一个变量,保存已经扫描过的sum值,每扫描一个数,如果sum<0,则加上这个数后一定比当前这个数小,所以让sum等于当前这个数,如果sum>=0,则让sum=sum+当前这个数。扫描的过程还有比较Max和sum的值,取较大值。示例代码如下:
public class Solution
{
public int FindGreatestSumOfSubArray(int[] array)
{
if(array==null||array.length<=0)
return 0;
int sum = array[0];
int maxSumOfSubArray = sum;
for (int i = 1; i < array.length; i++)
{
if (sum >=0)
{
sum=sum+array[i];
}
else
sum=array[i];
if(sum>maxSumOfSubArray)
maxSumOfSubArray=sum;
}
return maxSumOfSubArray;
}
}
最后,还有一种经典的动态规划算法(跟第二种方法类似),我们要找到状态转移方程:
假设f(j)表示从是s[0]到s[j]最大和,则f(j)=max(s[j],f(j-1)+s[j])。示例代码如下:
public static int FindGreatestSumOfSubArray3(int[] array)
{
if(array==null||array.length<=0)
return 0;
int maxSumOfSubArray = Integer.MIN_VALUE;
int sum=0;
for (int i = 0; i < array.length; i++)
{
sum=Math.max(array[i], array[i]+sum);
maxSumOfSubArray=Math.max(maxSumOfSubArray,sum);
}
return maxSumOfSubArray;
}
剑指offer面试题31连续子数组的最大和的更多相关文章
- 剑指 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. 连续子数 ...
- C++版 - 剑指offer 面试题31:连续子数组的最大和 题解
剑指offer:连续子数组的最大和 提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&am ...
随机推荐
- EF 5.0 帮助类
EF 5.0 帮助类 加入命名空间: using System; using System.Data; using System.Data.Entity; using System.Data.Enti ...
- WWDC2016-session402-whatsNewInSwift3
Dock 应用的介绍:1.设计到的东西多2.使用 swift 设计3.Dock 的代码量: 200,000行4.更少的重写相同功能的代码 swift.org 官网介绍 Swift Open Sourc ...
- EZGUI下的动态图片的处理
EZGUI的使用过程中,有时需要使用动态的图片,比如商店里面商品的ICON,好友的头像等,通过使用SimpleSprite可以实现这个功能. 比如一个通过网络显示好友头像: WWW www = n ...
- C primer plus 练习题 第七章
1. #include <stdio.h> #define SPACE ' ' #define NEWLINE '\n' int main() { int spaces,newlines, ...
- php 连接redis,并登录验证
环境: centos7 上安装了redis, 同时安装了php的redis扩展 yum install redis yum install php-pecl-redis redis服务端设置了登录密码 ...
- 探究MaxxBass音效
MaxxBass是什么?官方的介绍是这样的: — Patented Waves MaxxBass psycho-acoustic bassextension delivers a more natur ...
- VS2012未找到与约束ContractName...匹配的导出
用VS2012创建ARCGIS插件项目时,提示“未找到与约束ContractName...匹配的导出”,此前一直都是正常的额 经查,发现是近期系统相关更新导致,解决办法有两种途径: 一是删除近期更新的 ...
- 直接把数据库中的数据保存在CSV文件中
今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...
- `cocos2dx非完整` 游戏架构缩影 添加启动流程
这期的话题可能不是很好, 我没有想到很好的词句去更好的表达. 我一直都是很固执的认为, 同一类型的游戏,在开发做的前期工作上面其实都是可以复用的,也就是大同小异的.从游戏启动,启动日志,启动检查,检查 ...
- MyBatis知多少(17)MyBatis和JDBC
有了MyBatis,就不再需要编写JDBC代码了.像JDBCT这样的API的确非常强大,但使用起来总不免觉得太过繁琐.代码清单给出了一个使用JDBC的示例. 从这个例子中很容易看出,JDBC API会 ...