Skip to content

Commit 34ef072

Browse files
committed
+ problem 918
1 parent 06f7bb8 commit 34ef072

File tree

5 files changed

+142
-0
lines changed

5 files changed

+142
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# 918. Maximum Sum Circular Subarray
2+
Given a **circular integer array** `nums` of length `n`, return *the maximum possible sum of a non-empty **subarray** of* `nums`.
3+
4+
A **circular array** means the end of the array connects to the beginning of the array. Formally, the next element of `nums[i]` is `nums[(i + 1) % n]` and the previous element of `nums[i]` is `nums[(i - 1 + n) % n]`.
5+
6+
A **subarray** may only include each element of the fixed buffer `nums` at most once. Formally, for a subarray `nums[i], nums[i + 1], ..., nums[j]`, there does not exist `i <= k1`, `k2 <= j` with `k1 % n == k2 % n`.
7+
8+
#### Example 1:
9+
<pre>
10+
<strong>Input:</strong> nums = [1,-2,3,-2]
11+
<strong>Output:</strong> 3
12+
<strong>Explanation:</strong> Subarray [3] has maximum sum 3.
13+
</pre>
14+
15+
#### Example 2:
16+
<pre>
17+
<strong>Input:</strong> nums = [5,-3,5]
18+
<strong>Output:</strong> 10
19+
<strong>Explanation:</strong> Subarray [5,5] has maximum sum 5 + 5 = 10.
20+
</pre>
21+
22+
#### Example 3:
23+
<pre>
24+
<strong>Input:</strong> nums = [-3,-2,-3]
25+
<strong>Output:</strong> -2
26+
<strong>Explanation:</strong> Subarray [-2] has maximum sum -2.
27+
</pre>
28+
29+
#### Constraints:
30+
* `n == nums.length`
31+
* <code>1 <= n <= 3 * 10<sup>4</sup></code>
32+
* <code>-3 * 10<sup>4</sup> <= nums[i] <= 3 * 10<sup>4</sup></code>
33+
34+
## Solutions (Rust)
35+
36+
### 1. Solution
37+
```Rust
38+
impl Solution {
39+
pub fn max_subarray_sum_circular(nums: Vec<i32>) -> i32 {
40+
let sum = nums.iter().sum();
41+
let mut max_sum = nums[0];
42+
let mut min_sum = nums[0];
43+
let mut prefix_sum = nums[0];
44+
let mut ret = nums[0].max(sum);
45+
46+
for i in 1..nums.len() {
47+
prefix_sum += nums[i];
48+
ret = ret
49+
.max(prefix_sum - min_sum)
50+
.max(sum - prefix_sum + max_sum);
51+
max_sum = max_sum.max(prefix_sum);
52+
min_sum = min_sum.min(prefix_sum);
53+
}
54+
55+
ret
56+
}
57+
}
58+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# 918. 环形子数组的最大和
2+
给定一个长度为 `n`**环形整数数组** `nums` ,返回 *`nums` 的非空 **子数组** 的最大可能和*
3+
4+
**环形数组** 意味着数组的末端将会与开头相连呈环状。形式上, `nums[i]` 的下一个元素是 `nums[(i + 1) % n]``nums[i]` 的前一个元素是 `nums[(i - 1 + n) % n]`
5+
6+
**子数组** 最多只能包含固定缓冲区 `nums` 中的每个元素一次。形式上,对于子数组 `nums[i], nums[i + 1], ..., nums[j]` ,不存在 `i <= k1, k2 <= j` 其中 `k1 % n == k2 % n`
7+
8+
#### 示例 1:
9+
<pre>
10+
<strong>输入:</strong> nums = [1,-2,3,-2]
11+
<strong>输出:</strong> 3
12+
<strong>解释:</strong> 从子数组 [3] 得到最大和 3
13+
</pre>
14+
15+
#### 示例 2:
16+
<pre>
17+
<strong>输入:</strong> nums = [5,-3,5]
18+
<strong>输出:</strong> 10
19+
<strong>解释:</strong> 从子数组 [5,5] 得到最大和 5 + 5 = 10
20+
</pre>
21+
22+
#### 示例 3:
23+
<pre>
24+
<strong>输入:</strong> nums = [3,-2,2,-3]
25+
<strong>输出:</strong> 3
26+
<strong>解释:</strong> 从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3
27+
</pre>
28+
29+
#### 提示:
30+
* `n == nums.length`
31+
* <code>1 <= n <= 3 * 10<sup>4</sup></code>
32+
* <code>-3 * 10<sup>4</sup> <= nums[i] <= 3 * 10<sup>4</sup></code>
33+
34+
## 题解 (Rust)
35+
36+
### 1. 题解
37+
```Rust
38+
impl Solution {
39+
pub fn max_subarray_sum_circular(nums: Vec<i32>) -> i32 {
40+
let sum = nums.iter().sum();
41+
let mut max_sum = nums[0];
42+
let mut min_sum = nums[0];
43+
let mut prefix_sum = nums[0];
44+
let mut ret = nums[0].max(sum);
45+
46+
for i in 1..nums.len() {
47+
prefix_sum += nums[i];
48+
ret = ret
49+
.max(prefix_sum - min_sum)
50+
.max(sum - prefix_sum + max_sum);
51+
max_sum = max_sum.max(prefix_sum);
52+
min_sum = min_sum.min(prefix_sum);
53+
}
54+
55+
ret
56+
}
57+
}
58+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
impl Solution {
2+
pub fn max_subarray_sum_circular(nums: Vec<i32>) -> i32 {
3+
let sum = nums.iter().sum();
4+
let mut max_sum = nums[0];
5+
let mut min_sum = nums[0];
6+
let mut prefix_sum = nums[0];
7+
let mut ret = nums[0].max(sum);
8+
9+
for i in 1..nums.len() {
10+
prefix_sum += nums[i];
11+
ret = ret
12+
.max(prefix_sum - min_sum)
13+
.max(sum - prefix_sum + max_sum);
14+
max_sum = max_sum.max(prefix_sum);
15+
min_sum = min_sum.min(prefix_sum);
16+
}
17+
18+
ret
19+
}
20+
}

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@
564564
[915][915l] |[Partition Array into Disjoint Intervals][915] |![rb]&nbsp;&nbsp;![rs]
565565
[916][916l] |[Word Subsets][916] |![rb]&nbsp;&nbsp;![rs]
566566
[917][917l] |[Reverse Only Letters][917] |![py]
567+
[918][918l] |[Maximum Sum Circular Subarray][918] |![rs]
567568
[919][919l] |[Complete Binary Tree Inserter][919] |![py]
568569
[920][920l] |[Number of Music Playlists][920] |![rs]
569570
[921][921l] |[Minimum Add to Make Parentheses Valid][921] |![rs]
@@ -1986,6 +1987,7 @@
19861987
[915]:Problemset/0915-Partition%20Array%20into%20Disjoint%20Intervals/README.md#915-partition-array-into-disjoint-intervals
19871988
[916]:Problemset/0916-Word%20Subsets/README.md#916-word-subsets
19881989
[917]:Problemset/0917-Reverse%20Only%20Letters/README.md#917-reverse-only-letters
1990+
[918]:Problemset/0918-Maximum%20Sum%20Circular%20Subarray/README.md#918-maximum-sum-circular-subarray
19891991
[919]:Problemset/0919-Complete%20Binary%20Tree%20Inserter/README.md#919-complete-binary-tree-inserter
19901992
[920]:Problemset/0920-Number%20of%20Music%20Playlists/README.md#920-number-of-music-playlists
19911993
[921]:Problemset/0921-Minimum%20Add%20to%20Make%20Parentheses%20Valid/README.md#921-minimum-add-to-make-parentheses-valid
@@ -3407,6 +3409,7 @@
34073409
[915l]:https://leetcode.com/problems/partition-array-into-disjoint-intervals/
34083410
[916l]:https://leetcode.com/problems/word-subsets/
34093411
[917l]:https://leetcode.com/problems/reverse-only-letters/
3412+
[918l]:https://leetcode.com/problems/maximum-sum-circular-subarray/
34103413
[919l]:https://leetcode.com/problems/complete-binary-tree-inserter/
34113414
[920l]:https://leetcode.com/problems/number-of-music-playlists/
34123415
[921l]:https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/

README_CN.md

+3
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@
564564
[915][915l] |[分割数组][915] |![rb]&nbsp;&nbsp;![rs]
565565
[916][916l] |[单词子集][916] |![rb]&nbsp;&nbsp;![rs]
566566
[917][917l] |[仅仅反转字母][917] |![py]
567+
[918][918l] |[环形子数组的最大和][918] |![rs]
567568
[919][919l] |[完全二叉树插入器][919] |![py]
568569
[920][920l] |[播放列表的数量][920] |![rs]
569570
[921][921l] |[使括号有效的最少添加][921] |![rs]
@@ -1986,6 +1987,7 @@
19861987
[915]:Problemset/0915-Partition%20Array%20into%20Disjoint%20Intervals/README_CN.md#915-分割数组
19871988
[916]:Problemset/0916-Word%20Subsets/README_CN.md#916-单词子集
19881989
[917]:Problemset/0917-Reverse%20Only%20Letters/README_CN.md#917-仅仅反转字母
1990+
[918]:Problemset/0918-Maximum%20Sum%20Circular%20Subarray/README_CN.md#918-环形子数组的最大和
19891991
[919]:Problemset/0919-Complete%20Binary%20Tree%20Inserter/README_CN.md#919-完全二叉树插入器
19901992
[920]:Problemset/0920-Number%20of%20Music%20Playlists/README_CN.md#920-播放列表的数量
19911993
[921]:Problemset/0921-Minimum%20Add%20to%20Make%20Parentheses%20Valid/README_CN.md#921-使括号有效的最少添加
@@ -3407,6 +3409,7 @@
34073409
[915l]:https://leetcode.cn/problems/partition-array-into-disjoint-intervals/
34083410
[916l]:https://leetcode.cn/problems/word-subsets/
34093411
[917l]:https://leetcode.cn/problems/reverse-only-letters/
3412+
[918l]:https://leetcode.cn/problems/maximum-sum-circular-subarray/
34103413
[919l]:https://leetcode.cn/problems/complete-binary-tree-inserter/
34113414
[920l]:https://leetcode.cn/problems/number-of-music-playlists/
34123415
[921l]:https://leetcode.cn/problems/minimum-add-to-make-parentheses-valid/

0 commit comments

Comments
 (0)