剑指 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 ...
随机推荐
- P3853 [TJOI2007]路标设置
传送门 思路: 类似于数列分段的二分查找答案.设目前的 mid 是一个最小的“空旷指数”,那么在 sum 数组(路标数组)里每两个相邻间的路标距离一定要小于等于目前的 mid , 如果大于,那就必须使 ...
- 启动总是提示:Process finished with exit code 0
1.端口冲突检查端口号 2.缺少web启动依赖 <dependency> <groupId>org.springframework.boot</groupId> & ...
- JAVA中使用浮点数类型计算时,计算精度的问题
标题 在Java中实现浮点数的精确计算 AYellow(原作) 修改 关键字 Java 浮点数 精确计算 问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...
- CentOS7 使用firewalld打开关闭防火墙以及端口
1.firewalld的基本使用 启动 systemctl start firewalld 关闭 systemctl stop firewalld 查看状态 systemctl status fire ...
- 【测试工程师面试】面试官热衷询问的N个问题
1. 数据库中左连接右连接的区别 2.JAVA中continue和break的区别 3.Linux中查看某一个进程并且杀死 1.数据库中多表连接,根据不同的表的某一个字段进行关联, 左连接是将左边表全 ...
- 3.1 vue组件的使用
1. 组件 组件: 组件是一个局部功能界面,它包含了所有要实现这个功能界面的相关资源,如css.html等. 组件化编程: vue文件包含3个部分 <template> <div&g ...
- NYOJ 1277Decimal integer conversion (第九届河南省省赛)
XiaoMing likes mathematics, and heis just learning how to convert numbers between different bases , ...
- isnull和sum的关系
这是我刚刚写存储过程的时候意识到的一个问题!!! 先问大家这样一个问题,print 100+null 等于多少? 在一组数据统计的过程中,只要使用到sum函数,就必须使用isnull函数包含起来,因 ...
- 封装sqlhelper【一】
控件信息展示: //定义调用数据库类文件 namespace SqlHelper { public class TblClass { public int classId { get; set; } ...
- [原][粒子特效][spark]事件action
深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group调用action的地方: 可以看到使用action的可以是出生一次 ...