力扣算法刷题Day45|动态规划:爬楼梯 零钱兑换 完全平方数

力扣题目:#70. 爬楼梯

刷题时长:5min

解题方法:动态规划

复杂度分析

  • 时间复杂度: O(nm)
  • 空间复杂度: O(n)

问题总结

  • 条件判断背包容量时的逻辑是大于等于,漏掉了等于
  • 忘记dp数组初始化,递归五部曲,一步不能少

本题收获

  • 动规思路
    • 确定dp数组及下标的含义:爬到有i个台阶的楼顶,有dp[i]种方法
    • 确定递推公式:dp[i] += dp[i - j]
    • dp数组的初始化:dp[0] =1
    • 确定遍历顺序:将target放在外循环,将nums放在内循环,此题求排列

力扣题目:#322. 零钱兑换

刷题时长:30min

解题方法:动态规划

复杂度分析

  • 时间复杂度: O(n * amount),其中 n 为 coins 的长度
  • 空间复杂度: O(amount)

问题总结

  • 卡在无解的case,打印dp数组后才debug:若dp[amount]最后仍为初始化的值,则无解

本题收获

  • 动规思路
    • 确定dp数组及下标的含义:凑足总额为j所需钱币的最少个数为dp[j]
    • 确定递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j])
    • dp数组的初始化:dp[0] = 0, 下标非0的元素都是应该是最大值
    • 确定遍历顺序:coins(物品)放在外循环,target(背包)在内循环。且内循环正序

力扣题目:#279.完全平方数

刷题时长:10min

解题方法:动态规划

复杂度分析

  • 时间复杂度: O(n * √n)
  • 空间复杂度: O(n)

问题总结

  • 平方数数组不能剪枝,得计算到n^2,才能包含当n=1的边界情况

本题收获

  • 题意转换:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品
  • 动规思路:题解方法
    • 确定dp数组及下标的含义:和为j的完全平方数的最少数量为dp[j]
    • 确定递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j])
    • dp数组的初始化:dp[0]=0,非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖
    • 确定遍历顺序:外层for循环遍历物品,内层for遍历背包

你可能感兴趣的:(算法)