代码随想录算法训练营第四十五天| 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

Leetcode - 70

这题要用背包方法去做的话,就要想清楚如何转换为背包问题,首先想,物品是什么?由题目知,我们只能一步或者2步往上爬,所以就有物品 = [1,2],1,2无限使用,所以是完全背包,求总方案,所以是累加。1,2和2,1这里是两种方案,所以是排列问题,需要背包作为外层循环。

def climbStairs(self, n: int) -> int:
        res = [1,2]

        dp = [0] * (n+1)
        dp[0] = 1

        for j in range(1,len(dp)):
            for i in res:
                if j >=i:
                    dp[j] += dp[j - i]

        return dp[-1]

Leetcode - 322

这里硬币数无限,所以是完全背包。求最小方案,所以这里初始化的时候,初始化成最大的元素。方案中顺序无所谓,所以是组合问题,常规for循环。求方案数,所以value[i]就是1

def coinChange(self, coins: List[int], amount: int) -> int:
        dp= [float("INF")] * (amount +1)

        dp[0] = 0
        for i in coins:
            for j in range(i,amount+1):
                dp[j]  = min(dp[j],dp[j-i]+1)

        if dp[-1] ==float("INF"):
            return -1
        else:
            return dp[-1]

Leetcode - 279

这题和上一题几乎一样,重点就在于,物品的列表如何去构建,若从1~n间的所有数字一一进行判断,则会超时。一种方法是直接添加数的平方,当这个数的平方小于等于n时,就将这个数的平方加入列表。

其余的一样,最少,求Min, 组合问题,

def numSquares(self, n: int) -> int:
#一一判断会超时
        # def isSquare(num):
        #     if num ==1:
        #         return True
        #     else:
        #         end = num//2
        #         for i in range(1,end+1):
        #             if i ** 2 == num:
        #                 return True

        #         return False

        
        nums = [i**2 for i in range(1,n+1) if i**2 <=n]
    
        dp = [float("INF")] * (n+1)
        dp[0] = 0

        for i in nums:
            for j in range(i,len(dp)):
                dp[j] = min(dp[j],dp[j - i]+1)

        return dp[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值