Leetcode # 79. Perfect Squares
https://leetcode.com/problems/perfect-squares
Solution
問題所求的是合成數字 n 所需 perfect square 最小數量
故,此題
| dp[l] | := | l 個 perfect square 能合成出來的數 |
| = | [e + ps for e in dp[l – 1] for ps in pss] | |
| pss | := | [1, 4, 9, … , floor(n(1/2))2] |
若改成
| dp[l] | := | 合成數字 l 所需 perfect square 最小數量 |
| = | min([dp[l – ps] for ps in pss if l >= ps]) + 1 | |
| dp[0] | := | 0 |
則 time complexity 能再縮減為 O(n * (n(1/2)))
Time Complexity: O((n2) * (n(1/2)))
Space Complexity: O(n)
(The input and output generally do not count towards the space complexity.)
class Solution:
def numSquares(self, n: int) -> int:
pss = dp = [i ** 2 for i in range(1, int(n ** (1/2) + 1.5))]
if n in dp: return 1
for l in range(2, n + 1):
next_dp = []
for e in dp:
for ps in pss:
_e = e + ps
if _e < n:
next_dp.append(_e)
elif _e == n:
return l
dp = next_dp
↓
Time Complexity: O((n2) * (n(1/2)))
Space Complexity: O(n)
(The input and output generally do not count towards the space complexity.)
class Solution:
def numSquares(self, n: int) -> int:
pss = [i ** 2 for i in range(1, int(n ** (1/2) + 1.5))]
dp = [0] + [inf for l in range(n)]
for l in range(1, n + 1):
dp[l] = min([dp[l - ps] for ps in pss if l >= ps]) + 1
return dp[-1]
Last Updated on 2023/08/16 by A1go