卡码网:57. 爬楼梯:
跟昨天第三题一样,求排列数,先2阶后1阶算是两种方法。
def Stairs(n, m):
dp = [0] * (n + 1)
dp[0] = 1
for j in range(1, n + 1):
for i in range(1, m + 1):
if j - i >= 0:
dp[j] += dp[j - i]
return dp[n]
if __name__ == '__main__':
n, m = map(int, input().strip().split())
print(Stairs(n, m))
322. 零钱兑换:
求组和总和最小,内外循环顺序不影响结果。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for coin in coins:
for j in range(coin, amount + 1):
dp[j] = min(dp[j], dp[j - coin] + 1)
return dp[amount] if dp[amount] <= amount else -1
279. 完全平方数
第一感觉...三平方和定理...n年前搞竞赛时候杂志上读到的没ruan用的结论...
数论方法:
最坏情况O(n)时间复杂度,哦莫,优雅。
class Solution:
def numSquares(self, n: int) -> int:
def isPerfectSquare(x):
return int(math.sqrt(x)) ** 2 == x
def checkAnswer4(n):
while n % 4 == 0:
n //= 4
return n % 8 == 7
if isPerfectSquare(n):
return 1
if checkAnswer4(n):
return 4
for i in range(1, int(math.sqrt(n)) + 1):
if isPerfectSquare(n - i*i):
return 2
return 3
动态规划:
动规也很简单,跟上一题不能说一模一样,至少完全相同。
class Solution:
def numSquares(self, n: int) -> int:
m = int(math.sqrt(n))
dp = [float('inf')] * (n + 1)
dp[0] = 0
for i in range(1, m + 1):
for j in range(i ** 2, n + 1):
dp[j] = min(dp[j], dp[j - i ** 2] + 1)
return dp[n]
今日总结:
简单简单简单!!
如果每遇到一道题都可以告诉我用什么算法解决那就好了!!!