目錄
279. 完全平方數(待完善)
https://leetcode-cn.com/problems/perfect-squares/
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:輸入: n = 12,輸出: 3 ,解釋: 12 = 4 + 4 + 4.
示例 2:輸入: n = 13,輸出: 2,解釋: 13 = 4 + 9.
題解
一:動態規劃, 時間複雜度O(n^2),用dp[i]表示數字i被拆成的最少的完全平方數的個數。
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
dp = [i for i in xrange(n + 1)]
for i in xrange(2, n + 1):
for j in xrange(i):
if j * j == i:
dp[i] = 1
break
else:
dp[i] = min(dp[i], dp[j] + dp[i - j])
return dp[-1]
二:動態規劃, 時間複雜度,用dp[i]表示數字i被拆成的最少的完全平方數的個數,不過優化了一下,我們內層循環不再遍歷i前的所有數字,而是隻遍歷那些完全平方數,因爲只有完全平方數才能減少個數。
class Solution(object):
def numSquares(self, n):
#dp[i], 數字i符合題目要求的個
dp = [i for i in xrange(n + 1)]
for i in xrange(2, n + 1):
j = 0
while j <= sqrt(i):
target = j * j
dp[i] = min(dp[i], dp[i - target] + 1)
j += 1
return dp[-1]
三:mark一下,官方題解https://leetcode-cn.com/problems/perfect-squares/solution/wan-quan-ping-fang-shu-by-leetcode/,等刷一部分遞歸再來。