Skip to content

Commit b03c4e1

Browse files
committed
一刷918
1 parent c82eadc commit b03c4e1

File tree

6 files changed

+101
-67
lines changed

6 files changed

+101
-67
lines changed

README.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6451,14 +6451,14 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
64516451
//|{doc_base_url}/0917-reverse-only-letters.adoc[题解]
64526452
//|Easy
64536453
//|
6454-
//
6455-
//|{counter:codes}
6456-
//|{leetcode_base_url}/maximum-sum-circular-subarray/[918. Maximum Sum Circular Subarray^]
6457-
//|{source_base_url}/_0918_MaximumSumCircularSubarray.java[Java]
6458-
//|{doc_base_url}/0918-maximum-sum-circular-subarray.adoc[题解]
6459-
//|Medium
6460-
//|
6461-
//
6454+
6455+
|{counter:codes}
6456+
|{leetcode_base_url}/maximum-sum-circular-subarray/[918. Maximum Sum Circular Subarray^]
6457+
|{source_base_url}/_0918_MaximumSumCircularSubarray.java[Java]
6458+
|{doc_base_url}/0918-maximum-sum-circular-subarray.adoc[题解]
6459+
|Medium
6460+
|
6461+
64626462
//|{counter:codes}
64636463
//|{leetcode_base_url}/complete-binary-tree-inserter/[919. Complete Binary Tree Inserter^]
64646464
//|{source_base_url}/_0919_CompleteBinaryTreeInserter.java[Java]
Lines changed: 50 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,75 @@
11
[#0918-maximum-sum-circular-subarray]
2-
= 918. Maximum Sum Circular Subarray
2+
= 918. 环形子数组的最大和
33

4-
{leetcode}/problems/maximum-sum-circular-subarray/[LeetCode - Maximum Sum Circular Subarray^]
4+
https://leetcode.cn/problems/maximum-sum-circular-subarray/[LeetCode - 918. 环形子数组的最大和 ^]
55

6-
Given a *circular array* *C* of integers represented by `A`, find the maximum possible sum of a non-empty subarray of *C*.
6+
给定一个长度为 `n`**环形整数数组** `nums` ,返回 __ `nums` 的非空 *子数组* 的最大可能和__。
77
8-
Here, a _circular array_ means the end of the array connects to the beginning of the array. (Formally, `C[i] = A[i]` when `0 <= i < A.length`, and `C[i+A.length] = C[i]` when `i >= 0`.)
8+
*环形数组*__ __意味着数组的末端将会与开头相连呈环状。形式上,`+nums[i]+` 的下一个元素是 `nums[(i + 1) % n]` ,`nums[i]` 的前一个元素是 `nums[(i - 1 + n) % n]` 。
99
10-
Also, a subarray may only include each element of the fixed buffer `A` at most once. (Formally, for a subarray `C[i], C[i+1], ..., C[j]`, there does not exist `i <= k1, k2 <= j` with `k1 % A.length = k2 % A.length`.)
10+
*子数组* 最多只能包含固定缓冲区 `nums` 中的每个元素一次。形式上,对于子数组 `nums[i], nums[i + 1], ..., nums[j]` ,不存在 `+i <= k1, k2 <= j+` 其中 `k1 % n == k2 % n` 。
1111
12-
12+
*示例 1:*
1313
14+
....
15+
输入:nums = [1,-2,3,-2]
16+
输出:3
17+
解释:从子数组 [3] 得到最大和 3
18+
....
1419
15-
*Example 1:*
16-
17-
[subs="verbatim,quotes,macros"]
18-
----
19-
*Input:* [1,-2,3,-2]
20-
*Output:* 3
21-
*Explanation:* Subarray [3] has maximum sum 3
22-
----
23-
24-
25-
*Example 2:*
26-
27-
[subs="verbatim,quotes,macros"]
28-
----
29-
*Input:* [5,-3,5]
30-
*Output:* 10
31-
*Explanation:* Subarray [5,5] has maximum sum 5 + 5 = 10
32-
----
33-
34-
35-
*Example 3:*
36-
37-
[subs="verbatim,quotes,macros"]
38-
----
39-
*Input:* [3,-1,2,-1]
40-
*Output:* 4
41-
*Explanation:* Subarray [2,-1,3] has maximum sum 2 + (-1) + 3 = 4
42-
----
20+
*示例 2:*
4321
22+
....
23+
输入:nums = [5,-3,5]
24+
输出:10
25+
解释:从子数组 [5,5] 得到最大和 5 + 5 = 10
26+
....
4427
45-
*Example 4:*
28+
*示例 3:*
4629
47-
[subs="verbatim,quotes,macros"]
48-
----
49-
*Input:* [3,-2,2,-3]
50-
*Output:* 3
51-
*Explanation:* Subarray [3] and [3,-2,2] both have maximum sum 3
52-
----
53-
54-
*Example 5:*
55-
56-
[subs="verbatim,quotes,macros"]
57-
----
58-
*Input:* [-2,-3,-1]
59-
*Output:* -1
60-
*Explanation:* Subarray [-1] has maximum sum -1
61-
----
62-
63-
64-
65-
*Note: *
66-
67-
68-
. `-30000 <= A[i] <= 30000`
69-
. `1 <= A.length <= 30000`
30+
....
31+
输入:nums = [3,-2,2,-3]
32+
输出:3
33+
解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3
34+
....
7035
7136
37+
*提示:*
7238
39+
* `+n == nums.length+`
40+
* `1 \<= n \<= 3 * 10^4^`
41+
* `-3 * 10^4^ \<= nums[i] \<= 3 * 10^4^`
7342
7443
44+
== 思路分析
7545
46+
image::images/0918-10.png[{image_attr}]
7647
7748
7849
[[src-0918]]
50+
[tabs]
51+
====
52+
一刷::
53+
+
54+
--
7955
[{java_src_attr}]
8056
----
8157
include::{sourcedir}/_0918_MaximumSumCircularSubarray.java[tag=answer]
8258
----
59+
--
60+
61+
// 二刷::
62+
// +
63+
// --
64+
// [{java_src_attr}]
65+
// ----
66+
// include::{sourcedir}/_0918_MaximumSumCircularSubarray_2.java[tag=answer]
67+
// ----
68+
// --
69+
====
70+
71+
72+
== 参考资料
8373
74+
. https://leetcode.cn/problems/maximum-sum-circular-subarray/solutions/2350660/huan-xing-zi-shu-zu-de-zui-da-he-by-leet-elou/[918. 环形子数组的最大和 - 官方题解^]
75+
. https://leetcode.cn/problems/maximum-sum-circular-subarray/solutions/2351107/mei-you-si-lu-yi-zhang-tu-miao-dong-pyth-ilqh/[918. 环形子数组的最大和 - 没有思路?一张图秒懂!^]

docs/images/0918-10.png

54.5 KB
Loading

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1919,7 +1919,7 @@ include::0912-sort-an-array.adoc[leveloffset=+1]
19191919

19201920
// include::0917-reverse-only-letters.adoc[leveloffset=+1]
19211921

1922-
// include::0918-maximum-sum-circular-subarray.adoc[leveloffset=+1]
1922+
include::0918-maximum-sum-circular-subarray.adoc[leveloffset=+1]
19231923

19241924
// include::0919-complete-binary-tree-inserter.adoc[leveloffset=+1]
19251925

logbook/202503.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,12 @@ endif::[]
683683
|{doc_base_url}/1839-longest-substring-of-all-vowels-in-order.adoc[题解]
684684
|✅ 滑动窗口。题目不难,只是处理边界条件麻烦。另外,也有取巧解法,可以探索一下。
685685

686+
|{counter:codes2503}
687+
|{leetcode_base_url}/maximum-sum-circular-subarray/[918. 环形子数组的最大和^]
688+
|{doc_base_url}/0918-maximum-sum-circular-subarray.adoc[题解]
689+
|❌ 理解错题目了。前大,中小,后大,这类子数组也可以产生更多的子数组和。另有“取反”和单调栈解法。
690+
691+
686692
|===
687693

688694
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0918_MaximumSumCircularSubarray {
4+
// tag::answer[]
5+
6+
/**
7+
* @author D瓜哥 · https://www.diguage.com
8+
* @since 2025-05-14 16:27:15
9+
*/
10+
public int maxSubarraySumCircular(int[] nums) {
11+
int length = nums.length;
12+
int[] leftSumMax = new int[length];
13+
leftSumMax[0] = nums[0];
14+
int leftSum = nums[0];
15+
int result = nums[0];
16+
int preMax = nums[0];
17+
for (int i = 1; i < length; i++) {
18+
preMax = Math.max(preMax + nums[i], nums[i]);
19+
result = Math.max(result, preMax);
20+
leftSum += nums[i];
21+
leftSumMax[i] = Math.max(leftSumMax[i - 1], leftSum);
22+
}
23+
int rightMaxSum = 0;
24+
for (int i = length - 1; i > 0; i--) {
25+
rightMaxSum += nums[i];
26+
result = Math.max(result, rightMaxSum + leftSumMax[i - 1]);
27+
}
28+
return result;
29+
}
30+
31+
// end::answer[]
32+
public static void main(String[] args) {
33+
new _0918_MaximumSumCircularSubarray()
34+
.maxSubarraySumCircular(new int[]{5, -3, 5});
35+
}
36+
}

0 commit comments

Comments
 (0)