剑指 offer 面试题31 连续子数组的最大和(动态规划)
求连续子数组的最大和
题目描述
给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为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 连续子数组的最大和(动态规划)的更多相关文章
- 剑指offer面试题31连续子数组的最大和
一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...
- 剑指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 ...
随机推荐
- Linux——vi的使用
记录一下vi的一些使用指令,蓝色部分是比较常用的,其中使用过的重新进行了描述,极少部分是未使用过的,还有一些未使用也未记录进来,后续再来补充修正: 参考资料:http://cn.linux.vbird ...
- 关于Oracle 12C pdb用户无法登录的问题
新装了oracle12c,对新的CDB和PDB用户如何登录一直一头雾水,经过一晚上的查找,终于解决. sqlplus /nolog -> conn /as sysdba 登录到oracle 将s ...
- Vue技巧
转载:https://segmentfault.com/a/1190000014085613?utm_source=channel-hottest 对自己有用,做个笔记,有兴趣可以去以上地址去看. 第 ...
- C# 视频多人脸识别的实现
上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo基本思路如下:一.识别线程1.获取当前图片2.识别当前图片的人脸位置,并将结果存入 ...
- 学习笔记43—Linux基础集
1.通过窗口进入 /usr/local: 请点击computer; 通过窗口进入自己home目录:点击home即可.
- 浅谈Java简单实现的生产者与消费者问题
一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只 ...
- feature map 大小以及反卷积的理解
(1)边长的计算公式是: output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1 输入图片大小为200×200,依次经过一层卷积(ke ...
- Codeforces 841 D - Leha and another game about graph
D - Leha and another game about graph 思路:首先,如果所有点的度数加起来是奇数,且没有-1,那么是不可以的. 其他情况都可以构造,我们先dfs出一个生成树,然后从 ...
- C#中的var
var关键字是C#3.0开始新增的特性,称为推断类型(其实也就是弱化类型的定义). var a =23: 则a是整型,var a = “lgs”:则a是字符型,但使用Var类型要注意: 1.必须在定义 ...
- c# DLL封装并调用
1.封装自己的dll: a.打开visual studio - 文件 - 新建 - 项目- 类库 - 名称MyTestDll: b.右键Class1.cs - 修改为 TestDll.cs; c.在里 ...