题目:

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
注意:本题与 力扣 53 题相同

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:动态规划

动态规划需要做5步:

①确定dp数组(dp table)以及下标的含义

dp[i]:以nums[i]结尾的最大连续子数组的和

②确定递推公式

dp[i]可以有两个选项:dp[i-1] + nums[i] 或者nums[i],取两者最大值

  • 如果dp[i-1] <= 0,再加上nums[i]的话只会更小,还不如nums[i],故这时dp[i] = nums[i];
  • 如果dp[i-1] > 0,就加上nums[i],故这时dp[i] = dp[i-1] + nums[i];

③dp数组如何初始化

ddp[i]依赖于dp[i-1],故将dp[0]作为初始值,且可以假设dp[0] = nums[0]

④确定遍历顺序

从数组的 i = 1开始从后遍历(因为nums[0]已经赋值给dp[0]了)

⑤举例推导dp数组

以  nums = [-2,1,-3,4,-1,2,1,-5,4] 为例:

dp[0] = nums[0] = -2,初始化最大值res = nums[0] = -2

①dp[1] = max(dp[0] + nums[1], nums[1]) = nums[1] = 1,更新最大值 = 1

②dp[2] = max(dp[1] + nums[2], nums[2]) =dp[1] + nums[2] =  -2,更新最大值 = 不变 = 1

③dp[3] = max(dp[2] + nums[2], nums[2]) = nums[2] = 4,更新最大值 = 4

④dp[4] = max(dp[3] + nums[4], nums[4]) =dp[3] + nums[4] =  3,更新最大值 = 不变 = 4

⑤dp[5] = max(dp[4] + nums[5], nums[5]) = dp[4] + nums[5] = 5,更新最大值 = 5

⑥dp[6] = max(dp[5] + nums[6], nums[6]) = dp[5] + nums[6] = 6,更新最大值 = 6

⑦dp[7] = max(dp[6] + nums[7], nums[7]) = dp[6] + nums[7] = 1,更新最大值 = 不变 = 6

⑧dp[8] = max(dp[7] + nums[8], nums[8]) = dp[7] + nums[8] = 5,更新最大值 = 不变 = 6

最后返回res = 6

代码:

 1 class Solution {
2 public int maxSubArray(int[] nums) {
3 //题目明确说过长度大于1,不用判空
4 int[] dp = new int[nums.length];
5 //初始化
6 dp[0] = nums[0];
7 int res = nums[0];
8 for (int i = 1; i < nums.length; i++){
9 //状态转移方程
10 dp[i] += Math.max(dp[i-1]+nums[i], nums[i]);
11 //更新一下最大值
12 res = dp[i] >= res ? dp[i] : res;
13 }
14 return res;
15 }
16 }

转移状态的重点在于:若 dp[i−1]≤0 ,说明 dp[i−1] 对 dp[i] 产生负贡献,即 dp[i−1]+nums[i] 还不如 nums[i] 本身大。

可以看看:k神老师的题解

方法二:贪心法

贪心算法的本质:只考虑局部最优

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”,局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

思路:遍历数组nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。

代码:

 1 class Solution {
2 public int maxSubArray(int[] nums) {
3 if (nums.length == 1) return nums[0];
4 int count = 0,res = Integer.MIN_VALUE;
5 for (int i = 0; i < nums.length; i++){
6 count += nums[i];
7 //更新一下最大值
8 res = Math.max(res,count);
9 if(count < 0){
10 count = 0;
11 }
12 }
13 return res;
14 }
15 }

小知识:

①动态规划:

知识详情解释可以看看:代码随想录

动态规划需要做5步:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

②贪心法:详情解释:代码随想录贪心算法

剑指offer42(Java)-连续子数组的最大和(简单)的更多相关文章

  1. 剑指 Offer 42. 连续子数组的最大和 + 动态规划

    剑指 Offer 42. 连续子数组的最大和 题目链接 状态定义: 设动态规划列表 \(dp\) ,\(dp[i]\) 代表以元素 \(4nums[i]\) 为结尾的连续子数组最大和. 为何定义最大和 ...

  2. 刷题-力扣-剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...

  3. 力扣 - 剑指 Offer 42. 连续子数组的最大和

    题目 剑指 Offer 42. 连续子数组的最大和 思路1(分析数组的规律) 我们可以从头到尾逐个累加,若之前的累加和小于0,那就从丢弃之前的累加,从当前开始重新累加,同时在遍历过程中比较记录下最大值 ...

  4. 【剑指Offer】连续子数组的最大和 解题报告(Python)

    [剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. 《剑指Offer》- 连续子数组的最大和或最小和

    前言 本文是<剑指Offer>系列(JavaScript版)的第一篇,题目是"连续子数组的最大和或最小和". 话不多说,开始"打怪"修炼... 一. ...

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

    个開始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组測试数据包括两行. 第一行为一个整数n(0<=n<=100000),当n=0时,输入结束.接下去的一行包括n个整数 ...

  7. 【剑指offer】连续子数组的最大和,C++实现

    原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 # 题目       输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...

  8. 每日一题 - 剑指 Offer 42. 连续子数组的最大和

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 动态规划 难易程度:简单 题目描述: 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...

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

    题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为\(O(n)\). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1 ...

  10. 【Java】 剑指offer(42) 连续子数组的最大和

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整/ ...

随机推荐

  1. C#泛型的类型参数约束

    常用约束 约束告知编译器类型参数必须具备的功能. 在没有任何约束的情况下,类型参数可以是任何类型. 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类. 如果客户端 ...

  2. Centos挂在U盘的时候无法挂载

    网上的教学视频大部分全是以centos为教材底子--没办法更换系统了,这样方便麻! 我参考的文章: https://blog.csdn.net/shengjie87/article/details/1 ...

  3. Debian打开架构支持

    第一步检查内核有没有 AMD和i386 dpkg --list | grep linux-image  会出现现在电脑上的内核,可以看到支持的架构 dpkg --print-foreign-archi ...

  4. spring boot2集成api文档工具swagger-ui(上)

    说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...

  5. IValueConverter的基础用法

    1.我们在做工控项目的时候通常设置配方的上下限 这个时候要求OK数在上下限范围之内,否则NG 首先我们绑定一个简单的List用来展示数据,我这里用学生Age来展示 <ListView Items ...

  6. 记录--求你了,别再说不会JSONP了

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 JSONP是一种很远古用来解决跨域问题的技术,当然现在实际工作当中很少用到该技术了,但是很多同学在找工作面试过程中还是经常被问到,本文将带 ...

  7. Linux下配置node环境与failed to create symbolic link ‘/usr/bin/utserver’: File exists跟Error: Cannot find module '/root/node-v10.16.3-linux-x64/install'解决方法

    NodeJS下载地址(官网) https://nodejs.org/en/download/ 下载下来后是个tar,xz压缩包 通过xftp将压缩包上传到Linux服务器上 如我放在root目录下 使 ...

  8. 【FastDFS】面试官:如何实现文件的大规模分布式存储?(全程实战)

    写在前面 在<[FastDFS]小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?>一文中,详细的介绍了如何在CentOS 8服务器行搭建FastDFS环境.在生产环境中, ...

  9. Django实现WebSocket在线聊天室(channels库)

    1.Django实现WebSocket在线聊天室 1.1 安装channels pip install channels==2.3 (saas) F:\Desktop\Python_Study\CHS ...

  10. windows系统命令行cmd查看显卡驱动版本号CUDA

    Win+R 输入cmd 进入命令行 输入 nvidia-smi