题目

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).

输入
[1,-2,3,10,-4,7,2,-5]
返回值
18
说明:
输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。

分析

定义一个dp数组,dp[i]表示前i个元素的最大和。状态方程
dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];当前元素与他前面的元素的在求最大和时有两个选择,如果,前面子数组的最大和时正数就加上前面数组的最大和,反之不加。最后声明一个max变量保存最大值。最终返回max;

例如:
[1,-2,3,10,-4,7,2,-5]
dp[0] = 1
dp[1] = -1
dp[2] = 3
dp[3] = 13
dp[4] = 9
dp[5] = 16
dp[6] = 18
dp[7] = 13
所以最终最大和是dp[6] = 18

代码实现

public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
//如果数组为空返回0
if(array == null) return 0; //当前元素与他前面的元素的关系只有两种状态,加上与不加上他们的最大值,加不加看dp[i-1]的正负也即是
//dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i-1];
//max = Math.max(dp[i],max)
int len = array.length;
int dp[] = new int[len];
dp[0] = array[0];
int max=array[0]; for(int i=1;i<len;i++){
dp[i] = dp[i-1]<0?array[i]:dp[i-1]+array[i];
max = Math.max(dp[i],max);
}
return max;
}
}

空间复杂度O(n);时间复杂度O(n);

太菜了算法,继续努力吧!

剑指Offer-连续子数组中的最大和的更多相关文章

  1. 剑指Offer 连续子数组的最大和

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

  2. 用js刷剑指offer(连续子数组的最大和)

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

  3. 剑指Offer——连续子数组的最大和

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

  4. 剑指 Offer——连续子数组的最大和

    1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加.如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加. 初始化 max_sum 为数组的第一个 ...

  5. 剑指offer系列61---数组中的逆序对

    [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...

  6. 剑指offer系列54---数组中出现次数超过一半的数

    [题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因 ...

  7. 剑指offer系列24---数组中重复的数字

    * [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重 ...

  8. 剑指offer--43.连续子数组的最大和

    最大子段和,最大能取所有 ---------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度 ...

  9. 剑指Offer-30.连续子数组的最大和(C++/Java)

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

随机推荐

  1. Apriori 算法-如何进行关联规则挖掘

    公号:码农充电站pro 主页:https://codeshellme.github.io 在数据分析领域有一个经典的故事,叫做"尿布与啤酒". 据说,在美国西部的一家连锁超市发现, ...

  2. ThreadLocal原理记录,别被坑了!!

    简介 ThreadLocal的用处 ThreadLocal是为了将数据记录一份到某个线程里,确保该数据线程安全 例如数据库的Connection放入ThreadLocal,一个事务会用到很多DAO,但 ...

  3. AcWing 345. 牛站 Cow Relays

    由于我太菜了,不会矩阵乘法,所以给同样不会矩阵乘法同学的福利 首先发现这题点很多边很少,实际上有用的点 \(<= 2 * T\)(因为每条边会触及两个点嘛) 所以我们可以把点的范围缩到 \(2 ...

  4. php_memcache扩展

    今天在一家招聘信息看到需要熟悉memcache,以前没接触过,用的都是redis,今天稍微看了下,在这里记述下一些基础点. memcache是什么? 首先我们需要了解memcache是做什么的,他有什 ...

  5. 用列表+for循环生成乘法口诀表

    1 # 结合一下列表生成, 准备设计乘法表 2 # numlist = [1,2,3,4,5] 3 # [pow(i,3) for i in numlist] 4 # ## [1, 8, 27, 64 ...

  6. qq获取验证码接口

    测试 获取验证码 import smtplib from email.mime.text import MIMEText from email.utils import formataddr #定义参 ...

  7. MySQL MHA安装配置

    1.环境规划 192.168.12.131 node01 192.168.12.132 node02 192.168.12.133 node03 2.环境准备 一主两从GTID,略. 3.配置关键程序 ...

  8. Unity 游戏的暂停,继续,重开,退出

    1.暂停游戏.   Time.timeScale = 0;   2.继续游戏.   Time.timeScale = 1;   Time.timeScale = 0可以暂停游戏,Time.timeSc ...

  9. Maven笔记之核心概念及常用命令

    Maven的核心概念 Maven是一款服务于java平台的自动化构建工具. 自动化构建工具还有:make->ant->maven->gradle       1.约定的目录  2.P ...

  10. Containerd 的前世今生和保姆级入门教程

    原文链接:https://fuckcloudnative.io/posts/getting-started-with-containerd/ 1. Containerd 的前世今生 很久以前,Dock ...