渣渣的Leetcode之旅(Python3)_动态规划练习(198,213,518,279,118)

198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1] 输出:12 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5
号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        list_01 = [0]*len(nums)
        list_01[0] = nums[0]
        if nums[1] > nums[0]:
            list_01[1] = nums[1]
        else:
            list_01[1] = nums[0]
        for i in range(2,len(nums)):
            if nums[i] + list_01[i-2] > list_01[i-1]:
                list_01[i] = nums[i] + list_01[i-2]
            else:
                list_01[i] = list_01[i-1]
        return list_01[-1]

在这里插入图片描述

213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈
,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2] 输出:3 解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2),
因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1] 输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [0] 输出:0

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 1000

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums)==1:
            return nums[0]
        if len(nums) ==2:
            if nums[0] > nums[1]:
                return nums[0]
            else:
                return nums[1]
                
        fin_count = 0

        list_01 = [0]*(len(nums)-1)
        list_01[0] = nums[0]
        if nums[1] > nums[0]:
            list_01[1] = nums[1]
        else:
            list_01[1] = nums[0]     
        for i in range(2,len(nums)-1):
            if nums[i] + list_01[i-2] >= list_01[i-1]:
                list_01[i] = nums[i] + list_01[i-2]
            else:
                list_01[i] = list_01[i-1]
        fin_count = list_01[-1]

        list_01 = [0]*(len(nums)-1)
        list_01[0] = nums[1]
        if nums[2] > nums[1]:
            list_01[1] = nums[2]
        else:
            list_01[1] = nums[1]
        for i in range(3,len(nums)):
            if nums[i] + list_01[i-3] >= list_01[i-2]:
                list_01[i-1] = nums[i] + list_01[i-3]
            else:
                list_01[i-1] = list_01[i-2]
        if fin_count < list_01[-1]:
            fin_count = list_01[-1]
        return fin_count

在这里插入图片描述

518. 零钱兑换 II

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

示例 1:

输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1
5=2+1+1+1 5=1+1+1+1+1

示例 2:

输入: amount = 3, coins = [2] 输出: 0 解释: 只用面额2的硬币不能凑成总金额3。

示例 3:

输入: amount = 10, coins = [10] 输出: 1

注意:

你可以假设:

0 <= amount (总金额) <= 5000
1 <= coin (硬币面额) <= 5000
硬币种类不超过 500 种
结果符合 32 位符号整数

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change-2
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        coins.sort()
        list_01 = [0]*(amount+1)
        list_01[0] = 1
        for i in coins:
            for j in range(1,amount+1):
                if j-i >= 0:
                    list_01[j] += list_01[j-i]
        return list_01[-1]

在这里插入图片描述

279. 完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于
n。你需要让组成和的完全平方数的个数最少。

给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和
11 不是。

示例 1:

输入:n = 12 输出:3 解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13 输出:2 解释:13 = 4 + 9

提示:

1 <= n <= 104

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/perfect-squares
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ```

class Solution:
    def numSquares(self, n: int) -> int:
        dict_01 = {}
        for i in range(1,101):
            dict_01[i**2] = 1
        if n in dict_01:
            return 1
        list_01 = [0]*(n+1)
        list_01[1] = 1
        for i in range(2,n+1):
            if i in dict_01:
                list_01[i] = 1
                continue
            middle = i
            for j in range(1,i//2+1):
                temp = list_01[j] + list_01[i-j]
                if middle>temp:
                    middle = temp
            list_01[i] = middle
        return list_01[n]

118. 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5 输出: [
[1],
[1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        list_01 = []
        for i in range(0,numRows):
            if i == 0:
                list_01.append([1])
                continue
            if i == 1:
                list_01.append([1,1])
                continue
            else:
                list_02 = []
                list_02.append(1)
                for j in range(1,i):
                    a = list_01[i-1][j-1]+list_01[i-1][j]
                    list_02.append(a)
                list_02.append(1)
                list_01.append(list_02)
        return list_01

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值