Leetcode 198.打家劫舍(716)

题目

26年7月16日(首刷看解)

我的版本

Go 复制代码
func rob(nums []int)int{
//确定dp数组含义,dp[n]表示考虑打劫前n+1个房子,对应下标[0,n],最多的金额
    dp:=make([]int,len(nums))//表示下标[0,len(nums)-1]
    dp[0]=nums[0]
    if len(nums)>1{
        dp[1]=max(nums[0],nums[1])
    } 
    for i:=2;i<len(nums);i++{
        dp[i]=max(dp[i-1],dp[i-2]+nums[i])
    }
    return dp[len(nums)-1] 
}

随想录版本

Go 复制代码
func rob(nums []int) int {
    //确定dp数组含义,dp[n]表示考虑打劫前n间房子,对应数组下标[0,n-1]最多的金额
    dp:=make([]int,len(nums)+1)//表示下标[0,len(nums)]
    dp[0]=0
    dp[1]=nums[0]
    for i:=2;i<=len(nums);i++{
        dp[i]=max(dp[i-1],dp[i-2]+nums[i-1])
    }
    return dp[len(nums)]
}

思路

dp数组含义:

这道题dp数组第一种含义 是dpn(基于下标考虑) 代表考虑打劫前n+1间房的钱,就要想到,

1.最后返回的是dplen(nums)-1

2.dp数组遍历的时候,对应的数组下标就是0,n,是<len(nums)。不能取到len(nums),否则如果取了就是打劫了前len(nums)+1间房子

dp 数组第二种含义 ,dpn基于打劫房数考虑),代表打劫前n间的前,对应的数组是0,n-1

1.最后返回的是dplen(nums)-1

2.dp数组的时候,对应的数组下标是0,n-1,所以<=len(nums),要取到len(nums)。否则如果没取就是只打劫了前len(nums)-1间房子

建议统一选后面这一种(不用判断数组越界)

递推公式

如果当前打劫了n这一家,就要把这一家的钱+n-2家以及之前的家的钱,

如果没打劫n这一家,那么就返回考虑打劫n-1及之前的家的钱(注意:考虑n-1以及之前的钱,不一定一定打劫了n-1这一家

两者取最大值

注意不同的dp数组描述会导致不同的下标

第二种dp含义对应的是dp[i]=max(dp[i-1],dp[i-2]+nums[i-1])

初始化

第二种不用判断越不越界

第一种dp含义,需要判断有没有越界,当只有一家时,数组长度为1,初始化 dp1会越界,所以要判断 if len(nums)>1

相关推荐
不穿鞋的懒羊羊1 分钟前
dfs深度优先搜索
算法
OYYHXPJR23 分钟前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao25 分钟前
算法46,分治快排,排序数组
java·算法·排序算法·排序
JaguarJack26 分钟前
Whim 是什么?一门把 PHP 被否决的设想真跑起来的实验语言
后端·php·服务端
明月_清风38 分钟前
MHS:AI Agent 开始连接物理世界
人工智能·后端·网络协议
远航计算机41 分钟前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.41 分钟前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
ssshooter1 小时前
Node.js 天生就是异步的,为什么还要消息队列?
javascript·后端·面试
mmmmath_31 小时前
LeetCode.018.四数之和
数据结构·算法·leetcode
AIGCmagic社区1 小时前
腾讯混元 AuK 技术报告拆读:1.5B 统一语音生成与编辑,蒸馏后 4 步无 CFG 提速 4.5 倍
人工智能·算法·aigc·ai多模态