Skip to content

Commit c07136b

Browse files
committedJul 24, 2021
feat: add solutions to lc problem: No.0343. Integer Break
1 parent 53dfb60 commit c07136b

File tree

8 files changed

+170
-16
lines changed

8 files changed

+170
-16
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@
201201
- [零钱兑换](./solution/0300-0399/0322.Coin%20Change/README.md)
202202
- [零钱兑换 II](./solution/0500-0599/0518.Coin%20Change%202/README.md)
203203
- [组合总和 Ⅳ](./solution/0300-0399/0377.Combination%20Sum%20IV/README.md)
204+
- [整数拆分](./solution/0300-0399/0343.Integer%20Break/README.md)
204205
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
205206
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)
206207

‎README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
195195
- [Coin Change](./solution/0300-0399/0322.Coin%20Change/README_EN.md)
196196
- [Coin Change 2](./solution/0500-0599/0518.Coin%20Change%202/README_EN.md)
197197
- [Combination Sum IV](./solution/0300-0399/0377.Combination%20Sum%20IV/README_EN.md)
198+
- [Integer Break](./solution/0300-0399/0343.Integer%20Break/README_EN.md)
198199
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)
199200

200201
### Backtracking

‎solution/0300-0399/0343.Integer Break/README.md

+64-2
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,89 @@
2222

2323
<p><strong>说明: </strong>你可以假设&nbsp;<em>n&nbsp;</em>不小于 2 且不大于 58。</p>
2424

25-
2625
## 解法
2726

2827
<!-- 这里可写通用的实现逻辑 -->
2928

29+
动态规划。
30+
31+
设 dp[i] 表示正整数 n 能获得的最大乘积,初始化 `dp[1] = 1`
32+
33+
`i >= 2` 时,`dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)``j∈[0, i)`)。
34+
3035
<!-- tabs:start -->
3136

3237
### **Python3**
3338

3439
<!-- 这里可写当前语言的特殊实现逻辑 -->
3540

3641
```python
37-
42+
class Solution:
43+
def integerBreak(self, n: int) -> int:
44+
dp = [1] * (n + 1)
45+
for i in range(2, n + 1):
46+
for j in range(1, i):
47+
dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)
48+
return dp[n]
3849
```
3950

4051
### **Java**
4152

4253
<!-- 这里可写当前语言的特殊实现逻辑 -->
4354

4455
```java
56+
class Solution {
57+
public int integerBreak(int n) {
58+
int[] dp = new int[n + 1];
59+
dp[1] = 1;
60+
for (int i = 2; i <= n; ++i) {
61+
for (int j = 1; j < i; ++j) {
62+
dp[i] = Math.max(Math.max(dp[i], dp[i - j] * j), (i - j) * j);
63+
}
64+
}
65+
return dp[n];
66+
}
67+
}
68+
```
69+
70+
### **C++**
71+
72+
```cpp
73+
class Solution {
74+
public:
75+
int integerBreak(int n) {
76+
vector<int> dp(n + 1);
77+
dp[1] = 1;
78+
for (int i = 2; i <= n; ++i) {
79+
for (int j = 1; j < i; ++j) {
80+
dp[i] = max(max(dp[i], dp[i - j] * j), (i - j) * j);
81+
}
82+
}
83+
return dp[n];
84+
}
85+
};
86+
```
4587
88+
### **Go**
89+
90+
```go
91+
func integerBreak(n int) int {
92+
dp := make([]int, n+1)
93+
dp[1] = 1
94+
for i := 2; i <= n; i++ {
95+
for j := 1; j < i; j++ {
96+
dp[i] = max(max(dp[i], dp[i-j]*j), (i-j)*j)
97+
}
98+
}
99+
return dp[n]
100+
}
101+
102+
func max(a, b int) int {
103+
if a > b {
104+
return a
105+
}
106+
return b
107+
}
46108
```
47109

48110
### **...**

‎solution/0300-0399/0343.Integer Break/README_EN.md

+60-2
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,79 @@
3232
<li><code>2 &lt;= n &lt;= 58</code></li>
3333
</ul>
3434

35-
3635
## Solutions
3736

37+
Dynamic programming.
38+
3839
<!-- tabs:start -->
3940

4041
### **Python3**
4142

4243
```python
43-
44+
class Solution:
45+
def integerBreak(self, n: int) -> int:
46+
dp = [1] * (n + 1)
47+
for i in range(2, n + 1):
48+
for j in range(1, i):
49+
dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)
50+
return dp[n]
4451
```
4552

4653
### **Java**
4754

4855
```java
56+
class Solution {
57+
public int integerBreak(int n) {
58+
int[] dp = new int[n + 1];
59+
dp[1] = 1;
60+
for (int i = 2; i <= n; ++i) {
61+
for (int j = 1; j < i; ++j) {
62+
dp[i] = Math.max(Math.max(dp[i], dp[i - j] * j), (i - j) * j);
63+
}
64+
}
65+
return dp[n];
66+
}
67+
}
68+
```
69+
70+
### **C++**
71+
72+
```cpp
73+
class Solution {
74+
public:
75+
int integerBreak(int n) {
76+
vector<int> dp(n + 1);
77+
dp[1] = 1;
78+
for (int i = 2; i <= n; ++i) {
79+
for (int j = 1; j < i; ++j) {
80+
dp[i] = max(max(dp[i], dp[i - j] * j), (i - j) * j);
81+
}
82+
}
83+
return dp[n];
84+
}
85+
};
86+
```
4987
88+
### **Go**
89+
90+
```go
91+
func integerBreak(n int) int {
92+
dp := make([]int, n+1)
93+
dp[1] = 1
94+
for i := 2; i <= n; i++ {
95+
for j := 1; j < i; j++ {
96+
dp[i] = max(max(dp[i], dp[i-j]*j), (i-j)*j)
97+
}
98+
}
99+
return dp[n]
100+
}
101+
102+
func max(a, b int) int {
103+
if a > b {
104+
return a
105+
}
106+
return b
107+
}
50108
```
51109

52110
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int integerBreak(int n) {
4+
vector<int> dp(n + 1);
5+
dp[1] = 1;
6+
for (int i = 2; i <= n; ++i) {
7+
for (int j = 1; j < i; ++j) {
8+
dp[i] = max(max(dp[i], dp[i - j] * j), (i - j) * j);
9+
}
10+
}
11+
return dp[n];
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func integerBreak(n int) int {
2+
dp := make([]int, n+1)
3+
dp[1] = 1
4+
for i := 2; i <= n; i++ {
5+
for j := 1; j < i; j++ {
6+
dp[i] = max(max(dp[i], dp[i-j]*j), (i-j)*j)
7+
}
8+
}
9+
return dp[n]
10+
}
11+
12+
func max(a, b int) int {
13+
if a > b {
14+
return a
15+
}
16+
return b
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
class Solution {
22
public int integerBreak(int n) {
3-
if (n < 2) {
4-
return 0;
3+
int[] dp = new int[n + 1];
4+
dp[1] = 1;
5+
for (int i = 2; i <= n; ++i) {
6+
for (int j = 1; j < i; ++j) {
7+
dp[i] = Math.max(Math.max(dp[i], dp[i - j] * j), (i - j) * j);
8+
}
59
}
6-
if (n < 4) {
7-
return n - 1;
8-
}
9-
10-
int timesOf3 = n / 3;
11-
if (n % 3 == 1) {
12-
--timesOf3;
13-
}
14-
int timesOf2 = (n - timesOf3 * 3) >> 1;
15-
return (int) (Math.pow(2, timesOf2) * Math.pow(3, timesOf3));
10+
return dp[n];
1611
}
1712
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def integerBreak(self, n: int) -> int:
3+
dp = [1] * (n + 1)
4+
for i in range(2, n + 1):
5+
for j in range(1, i):
6+
dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)
7+
return dp[n]

0 commit comments

Comments
 (0)
Please sign in to comment.