LeetCode HOT 100:最大子数组和
题目:53. 最大子数组和
题目描述:
给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和。子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组,就叫原数组的子数组。
思路:
这种求子数组怎么怎么的问题,都可以向一种思维上靠拢。即以某一个元素为结尾的子数组中,得到一个结果。然后以每一个元素都作为结尾,得到很多个结果,然后在这些结果中进行处理,一定得到正确的结果。
以本题举个例子:数组[-2,1,-3],先将每一个元素作为结尾的子数组的最大和求出来。
- 以
-2作为子数组结尾,只有[-2]一个子数组,最大和为-2; - 以
1作为子数组结尾,有[-2,1]和[1]两个子数组,最大和为1; - 以
-3作为子数组结尾,有[-2,1,-3]和[1,-3]、[-3]三个子数组,最大和为-2;
所以这道题将所有结果进行比较大小,一定找到一个正确结果为1。因为正确的答案一定是由某一个元素结尾的子数组得出来的。所以找到每一个元素结尾的子数组的结果,然后进行处理,一定得到正确结果。这种思维需要培养,遇到子数组怎么怎么的问题,看能不能尽量往这上面靠拢。
下面继续说这道题,还是举例数组[-2,1,-3],我们既然确定了方向,要获得以每一个元素结尾的子数组的最大和,最终将这些结果再取最大值。那么可以将这个问题拆分成几个小问题:
- 子问题 1:以
−2结尾的子数组的最大和是多少; - 子问题 2:以
1结尾的子数组的最大和是多少; - 子问题 3:以
−3结尾的子数组的最大和是多少;
我们单独看子问题 1 和子问题 2:
子问题 1:以−2结尾的子数组的最大和是多少;
以−2结尾的子数组是[-2],因此最大和就是−2。
子问题 2:以1结尾的子数组的最大和是多少;
以1结尾的子数组有[-2,1]和[1],其中[-2,1]就是在「子问题 1」的后面加上1得到。−2+1=−1<1,因此「子问题 2」 的答案是1。
大家发现了吗,如果编号为i的子问题的结果是负数或者0 ,那么编号为i + 1的子问题就可以把编号为i的子问题的结果舍弃掉,这是因为:
一个数a加上负数或0的结果不可能比a更大;
而子问题的定义必须以一个数结尾,因此如果子问题i的结果是负数或者0,那么子问题i + 1的答案就是原数组i下标的那个数,因为前面的和被舍弃了。
步骤:
1、定义dp数组,表示以nums[i]结尾的子数组的最大和
2、遍历数组,根据上述思路,完善dp数组,并不断更新最大和
3、返回最大和
代码:
public int maxSubArray(int[] nums) {
// dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和
int[] dp = new int[nums.length];
dp[0] = nums[0];
int ans = nums[0];
for (int i = 1; i < nums.length; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
// 更新最大值
ans = Math.max(ans, dp[i]);
}
return ans;
}
空间优化代码:
// 因为dp[i]只和dp[i - 1]有关,所以可以优化空间
public int maxSubArray(int[] nums) {
int pre = nums[0];
int ans = nums[0];
for (int i = 1; i < nums.length; i++) {
if (pre > 0) {
pre = pre + nums[i];
} else {
pre = nums[i];
}
ans = Math.max(ans, pre);
}
return ans;
}
LeetCode HOT 100:最大子数组和的更多相关文章
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [Leetcode] maximun subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- [LeetCode] 53. Maximum Subarray 最大子数组
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [leetcode]53. Maximum Subarray最大子数组和
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- LeetCode Top 100 Liked 点赞最高的 100 道算法题
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
随机推荐
- 组件化开发1-git命令简洁版
1-给项目添加git git init 2-查询当前状态,(红色显示的为在工作区,绿色为暂缓区) git status 3-提交到暂缓区 git add . 4-提交到本地仓库('xxxx'里面为注释 ...
- centos7中配置java + mysql +jdk +使用jar部署项目
centos7中配置java + mysql +jdk +使用jar部署项目 思维导图 1. 配置JDK環境 1.1下载jdk安装包 Java Downloads | Oracle 1.2 将下载j ...
- 用 VS Code 搞Qt6:使用 PySide 6
一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本.此版本命名比较奇葩,叫 PySid ...
- 基于纯前端类Excel表格控件实现在线损益表应用
财务报表也称对外会计报表,是会计主体对外提供的反映企业或预算单位一定时期资金.利润状况的会计报表,由资产负债表.损益表.现金流量表或财务状况变动表.附表和附注构成.财务报表是财务报告的主要部分,不包括 ...
- Eureka Server 实现在线扩容
Eureka Server 实现在线扩容 作者:Grey 原文地址: 博客园:Eureka Server 实现在线扩容 CSDN:Eureka Server 实现在线扩容 需求 Eureka 是 Sp ...
- 51单片机-独立按键控制led矩阵的左移和右移
51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...
- Python基础部分:3、 pycharm的下载与使用
目录 pycharm下载与使用 一.软件说明 二.版本说明 三.如何免费使用正式版软件 四.pycharm运行空间 五.文件后缀名 六.安装pycharm工具 七.pycharm的基本配置和PY文件的 ...
- CH58X/CH57X/V208的Broadcaster(广播者)例程讲解
在对ble进行应用的时候,每个用户的需求可能不尽相同.这里着重介绍从机Broadcaster例程,只广播不连接. 使用该例程时可以在手机使用APP上对Broadcaster进行调试. 安卓端在应用市场 ...
- 手记系列之三 ----- 关于使用Nginx的一些使用方法和经验
前言 本篇文章主要介绍的关于本人在使用Nginx的一些使用方法和经验~ Nginx介绍 介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所 ...
- 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用
使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...