目录
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/,等刷一部分递归再来。