343. 整數拆分
給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
說明: 你可以假設 n 不小於 2 且不大於 58。
我的思路就是先找下規律:
5: 2x3=6
6: 3x3=9
7: 3x4=12
8: 2x3x3=18
9: 3x3x3=27
10: 3x3x4=36
大致的規律就是,需要把乙個平均分為堆數和堆裡面的個數最相近的那種情況。
這就需要使用除法,每次除以乙個數,得到商和餘數。例如
8 // 2 = 4
8 // 3 = 2 ~2
8 // 4 = 2
分析之後,我發現,只需要除數在2到 n // 2這個範圍內就可以了。
得到商和餘數之後,我們的目的是湊出最大的值。所以餘數需要載入在商上面,根據平均性的原則,我們每乙個商加一,平均分配,因為餘數是肯定小於商的個數的, 除數就是商的個數。
例如8 // 3 = 2~2 : 表示商為2,有3個,餘數為2。此時需要將餘數盡可能平均加在商上面,最終的商就是2;3;3;如果是餘數為0的情況,就直接相乘就可以了。
class
solution
:def
integerbreak
(self, n:
int)
->
int:
out =
0 temp =
1for i in
range(2
, n//2+
2): res = n % i
num = n // i
if res ==0:
#餘數為0,直接相乘
out =
max(out, num**i)
else
:#餘數不為0,要把餘數平分在商上面
temp = num**
(i-res)
#有i-res個商不會得到餘數的分配,先相乘
for _ in
range
(res)
:#能夠得到餘數的商,進行相乘
temp *=
(num+1)
out =
max(out, temp)
return out
經過上面的分析,最終得到乙個簡化的版本:
class
solution
:def
integerbreak
(self, n:
int)
->
int:
out =
0for i in
range(2
, n//2+
2): res = n % i
num = n // i
out =
max(out, num**
(i-res)
*(num+1)
**res)
return out
方法二:動態規劃的方法
實現**:
class
solution
:def
cuttingrope
(self, n:
int)
->
int:
if n <=3:
return n-
1 num, res = n//
3, n%
3if res ==0:
return
3**num
if res ==1:
return3**
(num-1)
*4if res ==2:
return
3**num*
2
LeetCode 343 整數拆分
給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。返回你可以獲得的最大乘積。例如,給定 n 2,返回1 2 1 1 給定 n 10,返回36 10 3 3 4 注意 你可以假設 n 不小於2且不大於58 class solution public int integerbr...
Leetcode 343 整數拆分
problem describe 給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。返回你可以獲得的最大乘積。示例 1 輸入 2 輸出 1 解釋 2 1 1,1 1 1。示例 2 輸入 10 輸出 36 解釋 10 3 3 4,3 3 4 36。說明 你可以假設 n 不小於...
leetcode343 整數拆分
題目 給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。返回你可以獲得的最大乘積。示例 示例 1 輸入 2 輸出 1 解釋 2 1 1,1 1 1。示例 2 輸入 10 輸出 36 解釋 10 3 3 4,3 3 4 36。說明 你可以假設 n 不小於 2 且不大於 58。...