mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Update 0343.整数拆分.md
This commit is contained in:
@ -245,20 +245,68 @@ class Solution {
|
||||
```
|
||||
|
||||
### Python
|
||||
动态规划(版本一)
|
||||
```python
|
||||
class Solution:
|
||||
def integerBreak(self, n: int) -> int:
|
||||
dp = [0] * (n + 1)
|
||||
dp[2] = 1
|
||||
# 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
|
||||
# 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
|
||||
# 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
|
||||
def integerBreak(self, n):
|
||||
dp = [0] * (n + 1) # 创建一个大小为n+1的数组来存储计算结果
|
||||
dp[2] = 1 # 初始化dp[2]为1,因为当n=2时,只有一个切割方式1+1=2,乘积为1
|
||||
|
||||
# 从3开始计算,直到n
|
||||
for i in range(3, n + 1):
|
||||
# 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
|
||||
# 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
|
||||
# 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
|
||||
for j in range(1, i / 2 + 1):
|
||||
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
|
||||
return dp[n]
|
||||
```
|
||||
# 遍历所有可能的切割点
|
||||
for j in range(1, i // 2 + 1):
|
||||
|
||||
# 计算切割点j和剩余部分(i-j)的乘积,并与之前的结果进行比较取较大值
|
||||
|
||||
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))
|
||||
|
||||
return dp[n] # 返回最终的计算结果
|
||||
|
||||
```
|
||||
动态规划(版本二)
|
||||
```python
|
||||
class Solution:
|
||||
def integerBreak(self, n):
|
||||
if n <= 3:
|
||||
return 1 * (n - 1) # 对于n小于等于3的情况,返回1 * (n - 1)
|
||||
|
||||
dp = [0] * (n + 1) # 创建一个大小为n+1的数组来存储最大乘积结果
|
||||
dp[1] = 1 # 当n等于1时,最大乘积为1
|
||||
dp[2] = 2 # 当n等于2时,最大乘积为2
|
||||
dp[3] = 3 # 当n等于3时,最大乘积为3
|
||||
|
||||
# 从4开始计算,直到n
|
||||
for i in range(4, n + 1):
|
||||
# 遍历所有可能的切割点
|
||||
for j in range(1, i // 2 + 1):
|
||||
# 计算切割点j和剩余部分(i - j)的乘积,并与之前的结果进行比较取较大值
|
||||
dp[i] = max(dp[i], dp[i - j] * dp[j])
|
||||
|
||||
return dp[n] # 返回整数拆分的最大乘积结果
|
||||
|
||||
```
|
||||
贪心
|
||||
```python
|
||||
class Solution:
|
||||
def integerBreak(self, n):
|
||||
if n == 2: # 当n等于2时,只有一种拆分方式:1+1=2,乘积为1
|
||||
return 1
|
||||
if n == 3: # 当n等于3时,只有一种拆分方式:1+1+1=3,乘积为1
|
||||
return 2
|
||||
if n == 4: # 当n等于4时,有两种拆分方式:2+2=4和1+1+1+1=4,乘积都为4
|
||||
return 4
|
||||
result = 1
|
||||
while n > 4:
|
||||
result *= 3 # 每次乘以3,因为3的乘积比其他数字更大
|
||||
n -= 3 # 每次减去3
|
||||
result *= n # 将剩余的n乘以最后的结果
|
||||
return result
|
||||
|
||||
```
|
||||
### Go
|
||||
```go
|
||||
func integerBreak(n int) int {
|
||||
|
Reference in New Issue
Block a user