演算法64-----完全平方數【動態規劃】
阿新 • • 發佈:2018-11-25
一、題目:
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...
)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n =12
輸出: 3 解釋:12 = 4 + 4 + 4.
示例 2:
輸入: n =13
輸出: 2 解釋:13 = 4 + 9.
二、思路:數學想法
- 四平方和定理:每個正整數都可以表示為至多4個正整數的平方和。故該題答案為1,2,3或4.
- 該數 n 若能整除4,則 n /= 4,結果不影響。【化簡】
- 如果一個數除以8餘7的話,那麼肯定是由4個完全平方陣列成。return 4
- 將其拆為兩個平方數之和,如果拆成功了那麼就會返回1或2,因為其中一個平方數可能為0,故判斷拆的兩個數是否為正整數
程式碼:
import math def numSquares(n): """ :type n: int :rtype: int """ #採用數學方式解決 while n % 4 == 0: n /= 4 if n % 8 == 7: return 4 i = 0while i * i <= n: b = int(math.sqrt(n - i*i)) if i * i + b * b == n: return (not (i == 0)) + (not (b == 0)) i += 1 return 3
三、動態規劃:狀態轉移方程:F(n) = min{ F(n-ai) + 1 } 其中ai為小於等於n的完全平方數
F(n)表示構成n的最少完全平方數的個數