Skip to content

Commit 7e3c8d8

Browse files
committed
二刷53
1 parent 434f6ed commit 7e3c8d8

File tree

5 files changed

+93
-13
lines changed

5 files changed

+93
-13
lines changed

README.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
401401
|{leetcode_base_url}/maximum-subarray/[53. Maximum Subarray^]
402402
|{source_base_url}/_0053_MaximumSubarray.java[Java]
403403
|{doc_base_url}/0053-maximum-subarray.adoc[题解]
404-
|Easy
404+
|Medium
405405
|
406406

407407
|{counter:codes}

docs/0053-maximum-subarray.adoc

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,73 @@
11
[#0053-maximum-subarray]
2-
= 53. Maximum Subarray
2+
= 53. 最大子数组和
33

4-
{leetcode}/problems/maximum-subarray/[LeetCode - Maximum Subarray^]
4+
https://leetcode.cn/problems/maximum-subarray/[LeetCode - 53. 最大子数组和 ^]
55

6-
Given an integer array `nums`, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
6+
给你一个整数数组 `nums`,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
77

8-
*Example:*
8+
**子数组**是数组中的一个连续部分。
99

10-
[subs="verbatim,quotes,macros"]
11-
----
12-
*Input:* [-2,1,-3,4,-1,2,1,-5,4],
13-
*Output:* 6
14-
*Explanation:* [4,-1,2,1] has the largest sum = 6.
15-
----
10+
*示例 1:*
11+
12+
....
13+
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
14+
输出:6
15+
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
16+
....
17+
18+
*示例 2:*
19+
20+
....
21+
输入:nums = [1]
22+
输出:1
23+
....
24+
25+
*示例 3:*
26+
27+
....
28+
输入:nums = [5,4,-1,7,8]
29+
输出:23
30+
....
31+
32+
*提示:*
33+
34+
* `1 \<= nums.length \<= 10^5^`
35+
* `-10^4^ \<= nums[i] \<= 10^4^`
1636
17-
*Follow up:*
37+
**进阶:**如果你已经实现复杂度为 stem:[O(n)] 的解法,尝试使用更为精妙的 *分治法* 求解。
1838

19-
If you have figured out the O(_n_) solution, try coding another solution using the divide and conquer approach, which is more subtle.
2039

40+
== 思路分析
41+
42+
使用动态规划,在“当前元素”与“当前元素加之前数组的和”之间,取最大值作为动态规划的结果,向前推进。在所有动态结果中,取最大值即可。
43+
44+
NOTE: 感觉做得有点莫名其妙,稀里糊涂就对了。另有更精妙的分治解法,抽空再尝试。
2145

2246
[[src-0053]]
47+
[tabs]
48+
====
49+
一刷::
50+
+
51+
--
2352
[{java_src_attr}]
2453
----
2554
include::{sourcedir}/_0053_MaximumSubarray.java[tag=answer]
2655
----
56+
--
57+
58+
二刷::
59+
+
60+
--
61+
[{java_src_attr}]
62+
----
63+
include::{sourcedir}/_0053_MaximumSubarray_2.java[tag=answer]
64+
----
65+
--
66+
====
67+
68+
69+
== 参考资料
70+
71+
. https://leetcode.cn/problems/maximum-subarray/solutions/228009/zui-da-zi-xu-he-by-leetcode-solution/[53. 最大子数组和 - 官方题解^]
72+
. https://leetcode.cn/problems/maximum-subarray/solutions/9058/dong-tai-gui-hua-fen-zhi-fa-python-dai-ma-java-dai/[53. 最大子数组和 - 经典动态规划问题(理解「无后效性」)^]
2773

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ endif::[]
145145
|{doc_base_url}/0207-course-schedule.adoc[题解]
146146
|✅ 拓扑排序
147147

148+
|{counter:codes}
149+
|{leetcode_base_url}/maximum-subarray/[53. Maximum Subarray^]
150+
|{doc_base_url}/0053-maximum-subarray.adoc[题解]
151+
|⭕️ 动态规划。稀里糊涂就对了,还要对推演。另有更精妙的分治解法,抽空再尝试。
152+
148153
|===
149154

150155
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0053_MaximumSubarray.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
*/
2828
public class _0053_MaximumSubarray {
2929
// tag::answer[]
30+
/**
31+
* @author D瓜哥 · https://www.diguage.com
32+
* @since 2019-10-23 11:47
33+
*/
3034
public int maxSubArrayDP(int[] nums) {
3135
// TODO Dynamic Programming
3236
// TODO Divide and Conquer
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0053_MaximumSubarray_2 {
4+
// tag::answer[]
5+
/**
6+
* @author D瓜哥 · https://www.diguage.com
7+
* @since 2025-04-05 11:05:10
8+
*/
9+
public int maxSubArray(int[] nums) {
10+
// 这里还可以优化成一个 int 型变量
11+
int[] dp = new int[nums.length];
12+
dp[0] = nums[0];
13+
int result = dp[0];
14+
for (int i = 1; i < nums.length; i++) {
15+
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
16+
result = Math.max(result, dp[i]);
17+
}
18+
return result;
19+
}
20+
// end::answer[]
21+
22+
public static void main(String[] args) {
23+
new _0053_MaximumSubarray_2().maxSubArray(new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4});
24+
}
25+
}

0 commit comments

Comments
 (0)