mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-10 20:40:39 +08:00
docs: 最大子序列和添加视频讲解链接
This commit is contained in:
@ -4,7 +4,6 @@
|
|||||||
</a>
|
</a>
|
||||||
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||||||
|
|
||||||
|
|
||||||
# 53. 最大子序和
|
# 53. 最大子序和
|
||||||
|
|
||||||
[力扣题目链接](https://leetcode.cn/problems/maximum-subarray/)
|
[力扣题目链接](https://leetcode.cn/problems/maximum-subarray/)
|
||||||
@ -12,17 +11,21 @@
|
|||||||
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
|
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
* 输入: [-2,1,-3,4,-1,2,1,-5,4]
|
|
||||||
* 输出: 6
|
|
||||||
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
|
|
||||||
|
|
||||||
|
- 输入: [-2,1,-3,4,-1,2,1,-5,4]
|
||||||
|
- 输出: 6
|
||||||
|
- 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
|
||||||
|
|
||||||
|
# 视频讲解
|
||||||
|
|
||||||
|
**《代码随想录》算法视频公开课:[贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和](https://www.bilibili.com/video/BV1aY4y1Z7ya),相信结合视频在看本篇题解,更有助于大家对本题的理解**。
|
||||||
|
|
||||||
## 暴力解法
|
## 暴力解法
|
||||||
|
|
||||||
暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值
|
暴力解法的思路,第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值
|
||||||
|
|
||||||
* 时间复杂度:O(n^2)
|
- 时间复杂度:O(n^2)
|
||||||
* 空间复杂度:O(1)
|
- 空间复杂度:O(1)
|
||||||
|
|
||||||
```CPP
|
```CPP
|
||||||
class Solution {
|
class Solution {
|
||||||
@ -56,12 +59,10 @@ public:
|
|||||||
|
|
||||||
**局部最优的情况下,并记录最大的“连续和”,可以推出全局最优**。
|
**局部最优的情况下,并记录最大的“连续和”,可以推出全局最优**。
|
||||||
|
|
||||||
|
|
||||||
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。
|
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。
|
||||||
|
|
||||||
**这相当于是暴力解法中的不断调整最大子序和区间的起始位置**。
|
**这相当于是暴力解法中的不断调整最大子序和区间的起始位置**。
|
||||||
|
|
||||||
|
|
||||||
**那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?**
|
**那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?**
|
||||||
|
|
||||||
区间的终止位置,其实就是如果 count 取到最大值了,及时记录下来了。例如如下代码:
|
区间的终止位置,其实就是如果 count 取到最大值了,及时记录下来了。例如如下代码:
|
||||||
@ -98,19 +99,17 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
* 时间复杂度:O(n)
|
- 时间复杂度:O(n)
|
||||||
* 空间复杂度:O(1)
|
- 空间复杂度:O(1)
|
||||||
|
|
||||||
当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。
|
当然题目没有说如果数组为空,应该返回什么,所以数组为空的话返回啥都可以了。
|
||||||
|
|
||||||
|
|
||||||
## 常见误区
|
## 常见误区
|
||||||
|
|
||||||
误区一:
|
误区一:
|
||||||
|
|
||||||
不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是 0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。
|
不少同学认为 如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是 0, 这是**又一次证明脑洞模拟不靠谱的经典案例**,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。
|
||||||
|
|
||||||
|
|
||||||
误区二:
|
误区二:
|
||||||
|
|
||||||
大家在使用贪心算法求解本题,经常陷入的误区,就是分不清,是遇到 负数就选择起始位置,还是连续和为负选择起始位置。
|
大家在使用贪心算法求解本题,经常陷入的误区,就是分不清,是遇到 负数就选择起始位置,还是连续和为负选择起始位置。
|
||||||
@ -123,8 +122,6 @@ public:
|
|||||||
|
|
||||||
其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。
|
其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 动态规划
|
## 动态规划
|
||||||
|
|
||||||
当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的 dp 方法。
|
当然本题还可以用动态规划来做,当前[「代码随想录」](https://img-blog.csdnimg.cn/20201124161234338.png)主要讲解贪心系列,后续到动态规划系列的时候会详细讲解本题的 dp 方法。
|
||||||
@ -148,8 +145,8 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
* 时间复杂度:O(n)
|
- 时间复杂度:O(n)
|
||||||
* 空间复杂度:O(n)
|
- 空间复杂度:O(n)
|
||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
@ -159,8 +156,8 @@ public:
|
|||||||
|
|
||||||
## 其他语言版本
|
## 其他语言版本
|
||||||
|
|
||||||
|
|
||||||
### Java
|
### Java
|
||||||
|
|
||||||
```java
|
```java
|
||||||
class Solution {
|
class Solution {
|
||||||
public int maxSubArray(int[] nums) {
|
public int maxSubArray(int[] nums) {
|
||||||
@ -201,6 +198,7 @@ class Solution {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Python
|
### Python
|
||||||
|
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def maxSubArray(self, nums: List[int]) -> int:
|
def maxSubArray(self, nums: List[int]) -> int:
|
||||||
@ -233,6 +231,7 @@ func maxSubArray(nums []int) int {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
pub fn max_sub_array(nums: Vec<i32>) -> i32 {
|
pub fn max_sub_array(nums: Vec<i32>) -> i32 {
|
||||||
let mut max_sum = i32::MIN;
|
let mut max_sum = i32::MIN;
|
||||||
@ -247,6 +246,7 @@ pub fn max_sub_array(nums: Vec<i32>) -> i32 {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Javascript:
|
### Javascript:
|
||||||
|
|
||||||
```Javascript
|
```Javascript
|
||||||
var maxSubArray = function(nums) {
|
var maxSubArray = function(nums) {
|
||||||
let result = -Infinity
|
let result = -Infinity
|
||||||
@ -264,9 +264,10 @@ var maxSubArray = function(nums) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### C:
|
### C:
|
||||||
|
|
||||||
贪心:
|
贪心:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
int maxSubArray(int* nums, int numsSize){
|
int maxSubArray(int* nums, int numsSize){
|
||||||
int maxVal = INT_MIN;
|
int maxVal = INT_MIN;
|
||||||
@ -286,6 +287,7 @@ int maxSubArray(int* nums, int numsSize){
|
|||||||
```
|
```
|
||||||
|
|
||||||
动态规划:
|
动态规划:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
/**
|
/**
|
||||||
* 解题思路:动态规划:
|
* 解题思路:动态规划:
|
||||||
@ -332,7 +334,7 @@ function maxSubArray(nums: number[]): number {
|
|||||||
if (curSum < 0) curSum = 0;
|
if (curSum < 0) curSum = 0;
|
||||||
}
|
}
|
||||||
return resMax;
|
return resMax;
|
||||||
};
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**动态规划**
|
**动态规划**
|
||||||
@ -350,7 +352,7 @@ function maxSubArray(nums: number[]): number {
|
|||||||
resMax = Math.max(resMax, dp[i]);
|
resMax = Math.max(resMax, dp[i]);
|
||||||
}
|
}
|
||||||
return resMax;
|
return resMax;
|
||||||
};
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Scala
|
### Scala
|
||||||
|
Reference in New Issue
Block a user