leetcode 343 整數拆分

2021-10-08 16:29:02 字數 2690 閱讀 7507

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。...