首页 > 编程语言 >代码随性训练营第四十八天(Python)| 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

代码随性训练营第四十八天(Python)| 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

时间:2023-11-30 19:23:03浏览次数:49  
标签:第四十八 return 198 nums max self len 打家劫舍 dp

198.打家劫舍
1、动态规划

class Solution:
    def rob(self, nums: List[int]) -> int:
        # dp 数组代表在第 i 个房间可以偷窃到的最高金额为 dp[i]
        dp = [0] * len(nums)
        if len(nums) == 1:
            return nums[0]
        if len(nums) == 2:
            return max(nums[0], nums[1])
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, len(nums)):
            dp[i] = max(dp[i-1], dp[i-2] + nums[i])
        return dp[-1]

2、优化版

class Solution:
    def rob(self, nums: List[int]) -> int:
        pre_max = 0 # 上一个房间的最大值
        cur_max = 0 # 当前房间的最大值
        for num in nums:
            tmp = cur_max
            cur_max = max(pre_max + num, cur_max)
            pre_max = tmp
        return cur_max

213.打家劫舍II

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return nums[0]
        return max(self.rob_line(nums[:-1]), self.rob_line(nums[1:]))

    def rob_line(self, nums):
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return nums[0]
        if len(nums) == 2:
            return max(nums[0], nums[1])
        dp = [0] * len(nums)
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, len(nums)):
            dp[i] = max(dp[i-1], dp[i-2] + nums[i])
        return dp[-1]

337.打家劫舍 III

class Solution:
    def rob(self, root: Optional[TreeNode]) -> int:
        # dp 数组的含义代表
        # 0 代表偷当前节点获取的最大利益
        # 1 代表不偷当前节点获取的最大利益
        dp = self.traversal(root)
        return max(dp)

    def traversal(self, root):
        if root is None:
            return (0, 0)

        leftdp = self.traversal(root.left)
        rightdp = self.traversal(root.right)

        # 偷当前节点
        val0 = root.val + leftdp[1] + rightdp[1]

        # 不偷当前节点
        val1 = max(leftdp[0], leftdp[1]) + max(rightdp[0], rightdp[1])

        return (val0, val1)

标签:第四十八,return,198,nums,max,self,len,打家劫舍,dp
From: https://www.cnblogs.com/yixff/p/17867944.html

相关文章

  • 使用RMAN Duplicate搭建DG,备库启动时报ORA-19838
    1、故障概要客户使用duplicate搭建DataGuard时,遭遇ORA-19838错误,备库无法mount,具体报错信息如下所示。 2、故障分析(1).与客户进行电话沟通,了解整个故障的过程:客户先在主库上进行RMAN备份,然后将备份集传输至备库,最后使用duplicatetargetdatabaseforstandbynofilenameche......
  • 配置上新 | 单双四核任选,TI Cortex-A53工业核心板仅198元起!
    创龙科技作为TI官方合作伙伴,在2022年9月即推出搭载TIAM62x最新明星处理器的工业核心板-SOM-TL62x。 SOM-TL62x工业核心板基于TISitara系列AM62x单/双/四核ARMCortex-A53+单核ARMCortex-M4F异构多核处理器设计,主频高达1.4GHz,支持2路TSN千兆网、3路CAN-FD、双屏异显、9路UAR......
  • 【洛谷 P1980】[NOIP2013 普及组] 计数问题 题解(取余)
    [NOIP2013普及组]计数问题题目描述试计算在区间到的所有整数中,数字()共出现了多少次?例如,在到中,即在中,数字出现了次。输入格式个整数,之间用一个空格隔开。输出格式个整数,表示出现的次数。样例#1样例输入#1111样例输出#14提示对于的数据,,。思路求每个数字的......
  • P4198 楼房重建
    P4198楼房重建(RE:题解再改造!!)码#include<bits/stdc++.h>#defineMAXN2000010usingnamespacestd;intn,m;intx[MAXN],y[MAXN],ans[MAXN];doubleK[MAXN];intquery(intp,intl,intr,doublemaxn){if(K[p]<=maxn)return0;if(l==r)returnK[p]>maxn;......
  • 198. 打家劫舍
    链接https://leetcode.cn/problems/house-robber/description/思路 相邻的要么选,要么不选。设置dp[i]表示以nums[i]为结尾的序列的最大收益。所以状态转移方程为:dp[i]=max(dp[i-1],dp[i-2]+nums[i]).根据这个定义,我们来对前2个元素初始化就ok了。代码classSolution:......
  • P2198 题解
    解题思路激光塔一定在最后。\(f_{i,j}\)表示前\(i\)个位置放\(j\)(\(j\lei\))个放射塔,那么\(i-j\)个干扰塔的伤害。若第\(i\)个位置放放射塔:\(f_{i,j}=f_{i-1,j-1}+(j-1)\timesg\times[t+b\times(i-j)]\)若第\(i\)个位置放干扰塔,也就是\(j<i\):\(f_{i,j}=\max\{f_{i-......
  • 1987-2008年考研数二真题全面解析
    1987|1988|1989|1990|1991......
  • P1989 无向图三元环计数 题解
    P1989无向图三元环计数题解考虑对无向图的边定向:对于每一条无向边,度数小的点向度数大的点连边,如果读书相等则按编号大小确定。这样枚举一个\(u\),再枚举它的出点\(v\),接着枚举\(v\)的出点\(w\),如果存在一个\(w\),\(u\)向它连边,那么\((u,v,w)\),就对应了原图中的一个三......
  • 又抢疯了!国产工业评估板仅售198元,追加200台!
    真的抢疯了!首批200台数天售罄!创龙科技基于全志双核[email protected]处理器T113-i的国产工业评估板含税仅售198元,凭借着超高的性价比受到工业用户的广泛关注,首批200台仅数天就售罄!感谢大家的热情支持!自一年前,创龙科技含税79元的T113-i核心板推出之后,已超过600家企业选用创龙科技......
  • LC每日一题 198.打家劫舍
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内......