Skip to content

Commit bc9bb96

Browse files
authored
feat: add solutions to lc problem: No.2178 (doocs#3986)
No.2178.Maximum Split of Positive Even Integers
1 parent db26b5f commit bc9bb96

File tree

5 files changed

+94
-18
lines changed

5 files changed

+94
-18
lines changed

solution/2100-2199/2178.Maximum Split of Positive Even Integers/README.md

+32-7
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ tags:
7575

7676
### 方法一:贪心
7777

78-
如果 $finalSum$ 是奇数,那么无法拆分成若干个互不相同的正偶数之和,直接返回空数组。
78+
如果 $\textit{finalSum}$ 是奇数,那么无法拆分成若干个互不相同的正偶数之和,直接返回空数组。
7979

80-
否则,我们可以贪心地按照 $2, 4, 6, \cdots$ 的顺序拆分 $finalSum$,直到 $finalSum$ 无法再拆分出一个不同的正偶数为止,此时我们将剩余的 $finalSum$ 加到最后一个正偶数上即可。
80+
否则,我们可以贪心地按照 $2, 4, 6, \cdots$ 的顺序拆分 $\textit{finalSum}$,直到 $\textit{finalSum}$ 无法再拆分出一个不同的正偶数为止,此时我们将剩余的 $\textit{finalSum}$ 加到最后一个正偶数上即可。
8181

82-
时间复杂度 $O(\sqrt{finalSum})$,忽略答案数组的空间消耗,空间复杂度 $O(1)$。
82+
时间复杂度 $O(\sqrt{\textit{finalSum}})$,忽略答案数组的空间消耗,空间复杂度 $O(1)$。
8383

8484
<!-- tabs:start -->
8585

@@ -88,13 +88,13 @@ tags:
8888
```python
8989
class Solution:
9090
def maximumEvenSplit(self, finalSum: int) -> List[int]:
91-
if finalSum % 2:
91+
if finalSum & 1:
9292
return []
93-
i = 2
9493
ans = []
94+
i = 2
9595
while i <= finalSum:
96-
ans.append(i)
9796
finalSum -= i
97+
ans.append(i)
9898
i += 2
9999
ans[-1] += finalSum
100100
return ans
@@ -126,7 +126,9 @@ class Solution {
126126
public:
127127
vector<long long> maximumEvenSplit(long long finalSum) {
128128
vector<long long> ans;
129-
if (finalSum % 2) return ans;
129+
if (finalSum % 2) {
130+
return ans;
131+
}
130132
for (long long i = 2; i <= finalSum; i += 2) {
131133
ans.push_back(i);
132134
finalSum -= i;
@@ -170,6 +172,29 @@ function maximumEvenSplit(finalSum: number): number[] {
170172
}
171173
```
172174

175+
#### Rust
176+
177+
```rust
178+
impl Solution {
179+
pub fn maximum_even_split(mut final_sum: i64) -> Vec<i64> {
180+
let mut ans = Vec::new();
181+
if final_sum % 2 != 0 {
182+
return ans;
183+
}
184+
let mut i = 2;
185+
while i <= final_sum {
186+
ans.push(i);
187+
final_sum -= i;
188+
i += 2;
189+
}
190+
if let Some(last) = ans.last_mut() {
191+
*last += final_sum;
192+
}
193+
ans
194+
}
195+
}
196+
```
197+
173198
#### C#
174199

175200
```cs

solution/2100-2199/2178.Maximum Split of Positive Even Integers/README_EN.md

+37-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Thus, we return an empty array.
5353
<pre>
5454
<strong>Input:</strong> finalSum = 28
5555
<strong>Output:</strong> [6,8,2,12]
56-
<strong>Explanation:</strong> The following are valid splits: <code>(2 + 26)</code>, <code>(6 + 8 + 2 + 12)</code>, and <code>(4 + 24)</code>.
56+
<strong>Explanation:</strong> The following are valid splits: <code>(2 + 26)</code>, <code>(6 + 8 + 2 + 12)</code>, and <code>(4 + 24)</code>.
5757
<code>(6 + 8 + 2 + 12)</code> has the maximum number of integers, which is 4. Thus, we return [6,8,2,12].
5858
Note that [10,2,4,12], [6,2,4,16], etc. are also accepted.
5959
</pre>
@@ -71,7 +71,13 @@ Note that [10,2,4,12], [6,2,4,16], etc. are also accepted.
7171

7272
<!-- solution:start -->
7373

74-
### Solution 1
74+
### Solution 1: Greedy
75+
76+
If $\textit{finalSum}$ is odd, it cannot be split into the sum of several distinct positive even integers, so we directly return an empty array.
77+
78+
Otherwise, we can greedily split $\textit{finalSum}$ in the order of $2, 4, 6, \cdots$, until $\textit{finalSum}$ can no longer be split into a different positive even integer. At this point, we add the remaining $\textit{finalSum}$ to the last positive even integer.
79+
80+
The time complexity is $O(\sqrt{\textit{finalSum}})$, and ignoring the space consumption of the answer array, the space complexity is $O(1)$.
7581

7682
<!-- tabs:start -->
7783

@@ -80,13 +86,13 @@ Note that [10,2,4,12], [6,2,4,16], etc. are also accepted.
8086
```python
8187
class Solution:
8288
def maximumEvenSplit(self, finalSum: int) -> List[int]:
83-
if finalSum % 2:
89+
if finalSum & 1:
8490
return []
85-
i = 2
8691
ans = []
92+
i = 2
8793
while i <= finalSum:
88-
ans.append(i)
8994
finalSum -= i
95+
ans.append(i)
9096
i += 2
9197
ans[-1] += finalSum
9298
return ans
@@ -118,7 +124,9 @@ class Solution {
118124
public:
119125
vector<long long> maximumEvenSplit(long long finalSum) {
120126
vector<long long> ans;
121-
if (finalSum % 2) return ans;
127+
if (finalSum % 2) {
128+
return ans;
129+
}
122130
for (long long i = 2; i <= finalSum; i += 2) {
123131
ans.push_back(i);
124132
finalSum -= i;
@@ -162,6 +170,29 @@ function maximumEvenSplit(finalSum: number): number[] {
162170
}
163171
```
164172

173+
#### Rust
174+
175+
```rust
176+
impl Solution {
177+
pub fn maximum_even_split(mut final_sum: i64) -> Vec<i64> {
178+
let mut ans = Vec::new();
179+
if final_sum % 2 != 0 {
180+
return ans;
181+
}
182+
let mut i = 2;
183+
while i <= final_sum {
184+
ans.push(i);
185+
final_sum -= i;
186+
i += 2;
187+
}
188+
if let Some(last) = ans.last_mut() {
189+
*last += final_sum;
190+
}
191+
ans
192+
}
193+
}
194+
```
195+
165196
#### C#
166197

167198
```cs

solution/2100-2199/2178.Maximum Split of Positive Even Integers/Solution.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ class Solution {
22
public:
33
vector<long long> maximumEvenSplit(long long finalSum) {
44
vector<long long> ans;
5-
if (finalSum % 2) return ans;
5+
if (finalSum % 2) {
6+
return ans;
7+
}
68
for (long long i = 2; i <= finalSum; i += 2) {
79
ans.push_back(i);
810
finalSum -= i;
911
}
1012
ans.back() += finalSum;
1113
return ans;
1214
}
13-
};
15+
};
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
class Solution:
22
def maximumEvenSplit(self, finalSum: int) -> List[int]:
3-
if finalSum % 2:
3+
if finalSum & 1:
44
return []
5-
i = 2
65
ans = []
6+
i = 2
77
while i <= finalSum:
8-
ans.append(i)
98
finalSum -= i
9+
ans.append(i)
1010
i += 2
1111
ans[-1] += finalSum
1212
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
impl Solution {
2+
pub fn maximum_even_split(mut final_sum: i64) -> Vec<i64> {
3+
let mut ans = Vec::new();
4+
if final_sum % 2 != 0 {
5+
return ans;
6+
}
7+
let mut i = 2;
8+
while i <= final_sum {
9+
ans.push(i);
10+
final_sum -= i;
11+
i += 2;
12+
}
13+
if let Some(last) = ans.last_mut() {
14+
*last += final_sum;
15+
}
16+
ans
17+
}
18+
}

0 commit comments

Comments
 (0)