LeetCode--198. 打家劫舍【从返回最大值到输出路径】

server/2025/3/17 17:42:39/

198. 打家劫舍

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

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


像这种dp都是三分钟出来了,难的又做不出来,感觉目前就是纯记忆了,真得废了

func rob(nums []int) int {n := len(nums)f := make([][]int, n)for i := 0; i < n; i ++ {f[i] = make([]int, 2)}f[0][1] = nums[0]for i := 1; i < n; i ++ {f[i][0] = max(f[i - 1][1], f[i - 1][0])f[i][1] = f[i - 1][0] + nums[i]}return max(f[n - 1][0], f[n - 1][1])
}

滚动数组优化

byd,这几把dp空间复杂度都O(1)了,好虾仁

func rob(nums []int) int {n := len(nums)f := make([][]int, 2)for i := 0; i < 2; i ++ {f[i] = make([]int, 2)}f[0][1] = nums[0]for i := 1; i < n; i ++ {f[i%2][0] = max(f[(i - 1)%2][1], f[(i - 1)%2][0])f[i%2][1] = f[(i - 1)%2][0] + nums[i]}return max(f[(n - 1)%2][0], f[(n - 1)%2][1])
}

无需二维数组的做法

虽然这种看起来还算优雅吧,但是在计算路径的时候可能不是太友好。

func rob(nums []int) int {n := len(nums)if n == 0 {return 0}if n == 1 {return nums[0]}f := make([]int, n + 2)nums[1] = max(nums[1], nums[0])for i := 2; i < n + 2; i ++ {f[i] = max(f[i - 1], f[i - 2] + nums[i - 2])}return f[n + 1]
}

输出路径

这部分还是花了一点时间,总体思路是用三位数组解决的,至于测试,我是通过遍历path,将ans加起来,然后return,通过了力扣的测试,应该是没啥问题的。

每次走都有一次路径的保存,同时有偷和不偷的两种选择,这个思路和上面是一样的,虽然这里完全可以优化很多空间,但是为了好理解,我直接把没有优化过的放出来了。

package mainimport "fmt"func rob(nums []int) int {n := len(nums)f := make([][]int, n)path := make([][][]int, n)for i := 0; i < n; i++ {f[i] = make([]int, 2)path[i] = make([][]int, 2)}f[0][1] = nums[0]path[0][1] = append([]int{}, nums[0])for i := 1; i < n; i++ {if f[i-1][0] > f[i-1][1] {f[i][0] = f[i-1][0]path[i][0] = append([]int{}, path[i-1][0]...)} else {f[i][0] = f[i-1][1]path[i][0] = append([]int{}, path[i-1][1]...)}f[i][1] = f[i-1][0] + nums[i]cur := append([]int{}, path[i-1][0]...)cur = append(cur, nums[i])path[i][1] = cur}if f[n-1][0] > f[n-1][1] {fmt.Println(path[n-1][0])return f[n-1][0]} else {fmt.Println(path[n-1][1])return f[n-1][1]}
}func main() {fmt.Println(rob([]int{1, 1, 1, 2}))
}

有一段时间没写blog了,只是因为感觉遇到的题没啥含金量,写不出什么东西来,就随便讲下思路就push上github了,感觉还是比较水,就没上传到博客上面,哈哈,有兴趣可以看看我的Github🥳


http://www.ppmy.cn/server/175744.html

相关文章

Qt 通过MSVC编译运行项目

第一步下载Qt 把Qt能选的插件都选上&#xff0c;有的是连接数据库必须得插件&#xff0c;有的是做图表必须得插件&#xff0c;有的是运行MSVC必须得插件&#xff0c;能选尽量都选上。 第二步安装VS2017&#xff0c;当然我们安装2017的目的主要是用C的编译器&#xff0c;这里提…

uniapp上传文件问题以及返回上一页出现退出app的问题记录

uniapp上传文件使用uni.uploadFile&#xff0c;如果直接一次性在success里完成会导致页面自动刷新&#xff0c;特别是添加了本页面有onshow()方法&#xff0c;上传完会自动调用onshow()方法。 建议使用官方的方式分成两个方法处理&#xff1a; async afterRead(event) {let f…

如何打造TikTok矩阵:多账号管理与内容引流的高效策略

随着短视频平台的崛起&#xff0c;TikTok成为了全球范围内最具影响力的社交平台之一。在这个平台上&#xff0c;通过精确的内容营销和运营策略&#xff0c;许多创作者和品牌成功实现了曝光、粉丝增长和变现。为了提高运营效率&#xff0c;许多专业的内容创作者和团队开始使用Ti…

【每日学点HarmonyOS Next知识】页面引用问题、Json三方库、路由表使用、下拉刷新问题、视频播放错误

1、HarmonyOS 全屏的自定义组件被其他页面引用后导致其他页面按钮功能无法使用问题&#xff1f; 参考代码&#xff1a; //1.index.ets Entry Component struct First {State visible: Visibility Visibility.Nonebuild() {// 使用stack可以实现假的dialog覆盖原页面上面Stac…

摄像头模块ISP处理流程

摄像头模块的ISP&#xff08;图像信号处理器&#xff09;处理流程是对图像传感器输出的原始信号进行系统性优化的过程&#xff0c;主要分为以下关键步骤及对应功能模块&#xff1a; 一、原始信号输入与预处理 ‌传感器信号捕获‌ CMOS/CCD传感器将光信号转换为模拟电信号&…

【QA】建造者模式在Qt有哪些应用

#设计模式 #Qt 一、QDomDocument&#xff08;XML 文档构建&#xff09; 模式角色&#xff1a; Builder&#xff1a;QDomDocument 本身Product&#xff1a;XML 文档对象Director&#xff1a;用户代码通过 QDomDocument 逐步构建文档结构 示例代码&#xff1a; QDomDocument…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

(C语言)写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和(递归函数)

#include <stdio.h> int DigitSum(int n){if(n<10){return n;}return (n%10)DigitSum(n/10); } int main(){printf("请输入一个非负整数:\n");int a0;while(1){if(scanf("%d",&a)!1 || a<0){printf("输入不合法请重新输入非负整数&am…