求连续子数组的最大和

题目描述

给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n);

测试用例

给定数组

{1,-2,3,10,-4,7,2,-5}

输出

18

思路分析

可以用动态规划的思想来完成:

用一个数组max[i]来存以第i个数字结尾的子数组的最大值

则max[i]有以下几种情况:

1.当i=0时,max[i] = data[i];

  例如max[0] = 1;

2.当max[i-1]<0时,max[i] = data[i];

  例如,由第4种情况得到max[2-1] = max[1] = -1<0,则max[2] = data[2] = 3;

3.当max[i-1]+data[i]<=0 && max[i-1]+data[i]<data[i]时,max[i] = data[i];

  例如存在数组{-1,-10},

  当i=1时:max[i-1]+data[i]=-1+(-10) = -11<0   &&   max[i-1]+data[i] = -11  <  data[i] =-10,

  所以max[1] = -10;

4.其他情况,max[i] = max[i-1]+data[i];

  例如max[1] = max[0]+data[1] = -1;

初始化数组max[]的同时,用一个变量保存一下前i个数里面的子数组的和的最大值

max[]初始化结束后,也就得到了连续子数组的最大和

根据以上思路,Java 代码如下:

public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int[] max= new int[array.length];
max[0] = array[0];
int maxNum = Integer.MIN_VALUE;
for(int i = 1; i<array.length;i++){
if(max[i-1]<0)
max[i] = array[i];
else if(maxx[i-1]+array[i]<=0 && max[i-1]+array[i]<array[i]){
max[i] = array[i];
}else{
max[i] = max[i-1]+array[i];
}
if(maxNum<max[i])
maxNum = max[i];
}
return maxNum;
}
}

剑指 offer 面试题31 连续子数组的最大和(动态规划)的更多相关文章

  1. 剑指offer面试题31连续子数组的最大和

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

  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. JNI C创建Java字符串数组

    创建Java字符串数组 注:jni中没有与String[]对应的数据类型,所以需要创建对象数组,循环添加jstring对象 #include <Sample3.h> #include &l ...

  2. 学习笔记27—python中numpy.ravel() 和 flatten()函数

    简介 首先声明两者所要实现的功能是一致的(将多维数组降位一维).这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平).两者的区别在于返回拷贝(copy)还是返回视图(vie ...

  3. Qt5模型/视图结构-视图(View)

    实现自定义的View,可继承自QAbstractItemView类,对所需的纯虚函数进行重定义与实现,对于QAbstractItemView类中的纯虚函数,在子类中必须进行重定义,但不一定要实现,可根 ...

  4. CSS/让一个盒子消失的5中方法

    1.display:none; 2.visibility:hidden;     //这种方法隐藏了还是会占位的 3.raba(0,0,0,0.5);     //可以调节a来改变透明度   a的取值 ...

  5. Yandex.Algorithm 2018, final round

    Yandex.Algorithm 2018, final round A Smart Vending B LIS vs. LDS C Eat And Walk D Search Engine E Gu ...

  6. Codeforces 1082 G - Petya and Graph

    G - Petya and Graph 思路: 最大权闭合子图 对于每条边,如果它选了,那么它连的的两个点也要选 边权为正,点权为负,那么就是求最大权闭合子图 代码: #pragma GCC opti ...

  7. Codeforces 458C - Elections

    458C - Elections 思路: 三分凹形函数极小值域 代码: #include<bits/stdc++.h> using namespace std; #define ll lo ...

  8. JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操作,在这里可以编写自己需要的代码(比如简单的判断).Action层:引用对应的Servi ...

  9. JAVA基础知识总结:二十

    一.网络编程基础 1.概念 所谓计算机网络,就是把分布在不同区域的计算机与专门的外部设备使用通信线路连接成一个规模大,功能比较强的网络系统,从而使得计算机之间可以相互通信,共享资源 所谓的网络编程,在 ...

  10. Unity --- 纹理压缩基本知识点

    1.Unity支持的压缩格式的分类,这里主要指Android平台和IOS平台: DXT格式 --- Nvidia Tegra(图睿)提供ETC  --- 安卓原生支持的,OPNEGL2.0都支持,ET ...