leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化

news2024/11/25 16:44:54

关于此题我的往期文章,动规五部曲详解篇

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://heheda.blog.csdn.net/article/details/133409962213. 打家劫舍 II - 力扣(LeetCode)


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

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



>>左闭右闭

(1)回溯 198. 打家劫舍 - 力扣(LeetCode)

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        function<int(int)>dfs = [&](int i) -> int {
            if(i<0) return 0;
            return max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(n-1);
    }
};
  • 超时!!! 

(2)递归搜索 + 保存计算结果 = 记忆化搜索

class Solution {
public:
    // 记忆化递归
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> memo(n,-1);
        function<int(int)>dfs = [&](int i) -> int {
            if(i<0) return 0;
            int& res = memo[i];
            if(res != -1) return res;
            return res=max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(n-1);
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        // int n=end-start+1;
        // vector<int> memo(n+1,-1);
        vector<int> memo(end+1,-1);
        function<int(int)>dfs = [&](int i) -> int {
            if(i<start) return 0;
            int& res = memo[i];
            if(res != -1) return res;
            return res=max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(end);
    }

    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

(3)1:1 翻译成递推

  • ① 1:1 翻译成递推:f[i] = max(f[i-1],f[i-2]+nums[i]);
class Solution {
public:
    // 1:1 翻译成递推:f[i] = max(f[i-1],f[i-2]+nums[i]);
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n,0);
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];
        f[0]=nums[0];
        f[1]=max(nums[0],nums[1]);
        for(int i=2;i<n;i++) 
            f[i] = max(f[i-1],f[i-2]+nums[i]);
        return f[n-1];
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        // int n = nums.size();
        int n = end+1;
        vector<int> f(n,0);
        f[start]=nums[start];
        f[start+1]=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++) 
            f[i] = max(f[i-1],f[i-2]+nums[i]);
        return f[end];
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};
  • ② 1:1 翻译成递推:f[i+2] = max(f[i+1],f[i]+nums[i]);
class Solution {
public:
    // 1:1 翻译成递推:f[i+2] = max(f[i+1],f[i]+nums[i]);
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n+2,0);
        for(int i=0;i<n;i++) 
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[n+1];
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    /*
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        int n = nums.size();
        vector<int> f(n+2,0);
        for(int i=start;i<n;i++)  
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[end+2];
    }*/
    int robRange(vector<int>& nums,int start,int end) {
        // int n = nums.size();
        int n=end+1;
        vector<int> f(n+2,0);
        for(int i=start;i<=end;i++)  
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[end+2];
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

(4)优化空间复杂度

  • f[i] = max(f[i-1],f[i-2]+nums[i]);
  • newF = max(f1,f0+nums[i]);
class Solution {
public:
    // 空间优化
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n==0) return 0;
        if(n==1) return nums[0];
        int f0=nums[0];
        int f1=max(nums[0],nums[1]);
        for(int i=2;i<n;i++) {
            int new_f = max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        int f0=nums[start];
        int f1=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++) {
            int new_f = max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }

    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};
  • f[i+2] = max(f[i+1],f[i]+nums[i]);
  • newF = max(f1,f0+nums[i]);
class Solution {
public: 
    // 空间优化
    int rob(vector<int>& nums) {
        int n = nums.size();
        int f0=0,f1=0;
        for(const int& x:nums) {
            int new_f = max(f1, f0 + x);
            f0 = f1;
            f1 = new_f;
        }
        return f1;
    }
};
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        int f0=0,f1=0;
        for(int i=start;i<=end;i++) {
            int new_f=max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

我的往期文章推荐:

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://heheda.blog.csdn.net/article/details/133409962leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134179583?spm=1001.2014.3001.5501leetCode 198.打家劫舍 动态规划 + 优化空间复杂度_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/133390944?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1169857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ShareGPT平替!利用苏格拉底提问模拟器更好地蒸馏ChatGPT对话能力

©PaperWeekly 原创 作者 | 孔楚伊 单位 | 深圳市大数据研究院 研究方向 | 自然语言处理 引言 基于真实用户与 ChatGPT 的互动&#xff0c;通过反转学习目标&#xff08;从学习回复到学习提问&#xff09;&#xff0c;训练更贴近真实用户的模拟器&#xff0c;更好的提问质…

电子产品上架Temu平台需要做什么认证?UL测试报告

2022年8月17日报道&#xff0c;TEMU正在筹备跨境电商平台。9月1日&#xff0c;TEMU跨境电商平台正式在海外上线&#xff0c;首站将面向北美市场&#xff0c;该平台命名为TEMU&#xff0c;App Store应用详情页显示意为“Team Up&#xff0c;Price Down”&#xff0c;即买得人越多…

3.线性神经网络-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…

欧盟网络安全威胁:虚假与错误信息

如今&#xff0c;数字平台已是新闻媒体的主战地。社交网站、新闻媒体、甚至搜索引擎都是现在大多数人的信息来源。由于这些网站的运作方式是通过吸引人们来产生网站流量&#xff0c;这些抓人眼球的信息通常是推广广告&#xff0c;有些甚至没有经过审查。 国际现状 恶意攻击者现…

机器视觉行业最大的污点是什么?99%机器视觉公司存在测量项目数据造假,很遗憾,本人不没有恪守技术的本分

机器视觉行业最大的污点是什么&#xff1f;99%机器视觉公司存在测量项目数据造假&#xff0c;很遗憾&#xff0c;本人没有恪守技术的本分。 1%是没做过机器视觉测量项目&#xff0c;我们应该具体分析和具体判断&#xff0c;更应该提高自己的认知能力和技术能力。 那我们​在现场…

linux+python3.6.8+uwsgi+postgresql+django部署web服务器

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

polarismesh安装

polarismesh安装 1.安装须知2.安装方式 1.安装须知 1.官方安装文档&#xff1a;https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AE%89%E8%A3%85/%E5%8D%95%E6%9C%BA%E7%89%88%E5%AE%89%E8%A3%85/ 2.下载地址 .github下载…

新形势下芯片研发如何实现数智化转型,革“芯”未来?龙智即将携手Perforce及Atlassian亮相ICCAD 2023

11月10-11日&#xff0c;龙智即将亮相中国集成电路设计业2023年会&#xff08;ICCAD&#xff09;&#xff0c;呈现集成了Perforce与Atlassian产品的芯片开发解决方案&#xff0c;帮助企业实现数智化转型&#xff0c;革“芯”未来。 龙智资深顾问、技术支持部门负责人李培将带来…

thinkphp的路径参数(RESTFul风格),把参数写在路径里

thinkphp官方文档 https://www.kancloud.cn/manual/thinkphp5_1/353969 有一个Blog控制器&#xff0c;里面的read方法是固定的&#xff0c;不能该 route.php里添加如下代码&#xff0c;访问 blog对应的就是 android/blog Route::resource(blog,android/blog);然后访问路径

招聘小程序源码 招聘网源码 人才网源码 招聘求职小程序源码

招聘小程序源码 招聘网源码 人才网源码 招聘求职小程序源码 功能介绍&#xff1a; 1、发布招聘&#xff0c;建立企业人才库 支持企业入驻发布招聘职位&#xff0c;建立人才库&#xff1b; 2、发布简历&#xff0c;在线投简历 支持用户发布简历&#xff0c;向意向职位在线投简…

LeetCode算法题解(回溯)|LeetCode216. 组合总和 III、LeetCode17. 电话号码的字母组合

一、|LeetCode216. 组合总和 III 题目链接&#xff1a;216. 组合总和 III 题目描述&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同…

【小白专用】微信小程序个人中心、我的界面(示例一)23.11.04

微信小程序使用button按钮实现个人中心、我的界面&#xff08;示例一&#xff09; 微信小程序个人中心、我的界面&#xff0c;使用button按钮实现界面布局&#xff0c;更好的将分享好友、获取头像等功能展现出来&#xff0c;更多示例界面&#xff0c;请前往我的主页哦。 1、js…

电子凭证会计数据标准试点深化后,企业管理的关键点在于什么?

为了加快建设数字中国、发展数字经济发展&#xff0c;并推动经济社会绿色化、低碳化发展&#xff0c;政府部门一直大力推动企业的数字化转型。 企业的经营活动也越来越活跃。企业在经营中产生了大量的票据&#xff0c;由于电子凭证分属不同的部门管理&#xff0c;数据不兼容&am…

黔院长 | 贵州四部门联合发文加强新时代中医药人才工作!

近日&#xff0c;贵州省中医药管理局、省教育厅、省人力资源社会保障厅和省卫生健康委联合印发《关于加强新时代中医药人才工作的实施意见》&#xff0c;《意见》强调培训”能中会西“的基层医生&#xff01; 《意见》提出&#xff0c;要加强中医药高层次人才队伍建设&#xff…

Day19力扣打卡

打卡记录 填充每个节点的下一个右侧节点指针 II&#xff08;BFS层序遍历&#xff09; 链接 采用BFS层序遍历&#xff0c;将每一层的节点遍历之后存入数组中&#xff0c;再对数组中一层中的所有节点遍历来进行next连接&#xff0c;再同时更新下一层的所有节点到数组当中。 /*…

如何在知识付费系统小程序开发中实现社区互动和用户参与

在知识付费系统小程序的开发中&#xff0c;实现社区互动和用户参与可以通过以下步骤实现&#xff1a; 1. 建立用户身份验证和管理系统 // 后端示例代码&#xff08;Node.js&#xff09; // 用户注册 app.post(/register, (req, res) > {const { username, email, passwor…

前端性能分析工具

前段时间在工作中,需要判断模块bundle size缩减对页面的哪些性能产生了影响, 因此需要了解前端的性能指标如何定义的,以及前端有哪些性能分析工具, 于是顺便整理了一篇笔记, 以供前端小白对性能这块知识点做一个入门级的了解. 页面渲染 在了解性能指标和分析工具之前,有必要先…

软件开发项目文档系列之十如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…

IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】

Docker官网 Docker官网&#xff1a;https://www.docker.com/ Docker Hub官网&#xff1a;http://hub.docker.com/ 什么是Docker Docker 是一个开源的容器引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编…

ATFX汇市:英国央行维持基准利率不变,至此“美欧英”三大央行均宣布暂停加息

ATFX汇市&#xff1a;英国央行11月份利率决议上&#xff0c;货币政策委员会以 6 票对 3 票的多数投票决定将银行利率维持在 5.25%&#xff0c;原因在于&#xff0c;央行认为英国 GDP 在 2023 年第三季度将持平&#xff0c;弱于 8 月报告中的预测&#xff0c;另外&#xff0c;一…