一、题目描述

  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连续子数组的最大和的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. leetcode面试题42. 连续子数组的最大和

      总结一道leetcode上的高频题,反反复复遇到了好多次,特别适合作为一道动态规划入门题,本文将详细的从读题开始,介绍解题思路. 题目描述示例动态规划分析代码结果 题目   面试题42. 连续子数 ...

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

    剑指offer:连续子数组的最大和 提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&am ...

随机推荐

  1. [转]移动端web页面使用字体的思考

    一直不知道手机端用的什么字体,只是觉得类似雅黑,直到有一次设计师问到设计移动web页面该用什么字体才严肃地想起这个问题. 前人已栽树,后人我就直接转来吧…… 回想2年前刚开始接触手机项目,接到PSD稿 ...

  2. Android杂谈--HTC等手机接收不到UDP广播报文的解决方案

    最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...

  3. ubuntu-15.04-server-i386.iso 安装 Oracle 11gR2 数据库

    特点: 需要重新安装老版本的 libaio1_0.3.109-2ubuntu?_i386.deb.默认的libaio库有问题,和其默认libaio的编译方式有关! 默认的gcc 4.9 需要使用 -W ...

  4. 提高FOR插入数据库动作的优化代码

    await Task.Factory.StartNew(() => Parallel.ForEach(result.data.o, s => { sql = "insert in ...

  5. [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB

    Matt Pietrek Download the code for this article: Hood0101.exe (45KB) W ay back in my October 1996 co ...

  6. 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现

    /* * ===================================================================================== * * Filen ...

  7. [PaPaPa][需求说明书][V0.3]

    PaPaPa软件需求说明书V0.3 前   言 不好意思,本文是没有前言的. 别说是前言了,其实关于界面的内容我也是不打算写!!   因为我知道你们想要的界面是这样的: 再不济也应该是这样的: 但是我 ...

  8. (转)Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)

      异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Application.LoadLevel(“yourScene ...

  9. 尝鲜CodeBlocks

    在寻找跨平台的C++ IDE,就尝试了CodeBlocks,写了个HelloWorld,测试了一下C++11的代码,我很喜欢他的代码着色,看着很清爽. 记得要打开C++11的支持:

  10. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...