当前位置: 首页 > news >正文

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

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

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

相关文章:

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

关于此题我的往期文章,动规五部曲详解篇&#xff1a; leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢&#xff1f;_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133409962213. 打家劫舍 II - 力扣&#x…...

网络编程套接字(二)

目录 简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求单执行流服务器的弊端 多进程版TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务多线程版的TCP网络程序客户端创建套接字客户端链接服务器客户端发起请求 线程池版的TCP网络程序 简单的T…...

[极客大挑战 2019]Knife 1(两种解法)

题目环境&#xff1a; 这道题主要考察中国菜刀和中国蚁剑的使用方法 以及对PHP一句话木马的理解 咱们先了解一下PHP一句话木马&#xff0c;好吗&#xff1f; **eval($_POST["Syc"]);** **eval是PHP代码执行函数&#xff0c;**把字符串按照 PHP 代码来执行。 $_POST P…...

国家统计局教育部各级各类学历教育学生情况数据爬取

教育部数据爬取 1、数据来源2、爬取目标3、网页分析4、爬取与解析5、如何使用Excel打开CSV1、数据来源 国家统计局:http://www.stats.gov.cn/sj/ 教育部:http://www.moe.gov.cn/jyb_sjzl/ 数据来源:国家统计局教育部文献教育统计数据2021年全国基本情况(各级各类学历教育学…...

mysql、clickhouse时间日期加法

mysql 在’2023-10-27 23:59:59’上增加5秒&#xff1a; SELECT DATE_ADD(2023-10-27 23:59:59, INTERVAL 5 second);clickhouse SELECT date_add(SECOND, 3, toDate(2018-01-01 00:00:00));clickhouse时间按秒、分、时、日、月、年作差 按秒&#xff1a; SELECT dateDiff…...

21.合并两个有序链表

#include <iostream>struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {} };class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode dummy ListNode(-1); // 创建一个虚拟节点作为头节点ListNode* …...

thinkphp漏洞复现

thinkphp漏洞复现 ThinkPHP 2.x 任意代码执行漏洞Thinkphp5 5.0.22/5.1.29 远程代码执行ThinkPHP5 5.0.23 远程代码执行ThinkPHP5 SQL Injection Vulnerability && Sensitive Information Disclosure VulnerabilityThinkPHP Lang Local File Inclusion ThinkPHP 2.x 任…...

暴力递归转动态规划(十三)

题目 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c;等着英雄来砍自己 英雄每一次打击&#xff0c;都会让怪兽流失[0~M]的血量 到底流失多少&#xff1f;每一次在[0~M]上等概率的获得一个值 求K次打击之后&#xff0c;英雄把怪兽砍死的概率。 暴…...

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …...

记录paddlepaddle-gpu安装

背景 由于最近需要使用paddleocr&#xff0c;因此需要安装依赖paddlepaddle-gpu&#xff0c;不管怎么安装cuda11.6-11.8安装了一遍&#xff0c;都无法正常安装成功。如下所示&#xff1a; 环境&#xff1a;wsl2linux18.04 >>> import paddle >>> paddle.u…...

django如何连接sqlite数据库?

目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点&…...

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…...

云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介 k8s&#xff08;Kubernetes&#xff09; 是容器管理平台&#xff0c;用来管理容器化的应用&#xff0c;提供快速的容器调度、弹性伸缩等诸多功能&#xff0c;可以理解为容器云&#xff0c;不涉及到业务层面的开发。只要你的应用可以实现容器化&#xff0c;就可以部…...

性能压力测试主要目标及步骤

性能压力测试是软件开发生命周期中至关重要的一部分&#xff0c;旨在评估应用程序或系统在高负载和极端条件下的性能表现。这种测试有助于发现性能瓶颈、资源耗尽和错误&#xff0c;以确保应用程序在真实使用情况下的可靠性和稳定性。本文将探讨性能压力测试的概念、方法和最佳…...

VLAN与配置

VLAN与配置 什么是VLAN 以最简单的形式为例。如下图&#xff0c;此时有4台主机处于同一局域网中&#xff0c;很明显这4台主机是能够直接通讯。但此时我需要让处于同一局域网中的PC3和PC4能通讯&#xff0c;PC5和PC6能通讯&#xff0c;并且PC3和PC4不能与PC5和PC6通讯。 为了实…...

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一&#xff0c;使用HTTP接口开发和调用都很方便&#xff0c;也是被大量采用的方式&#xff0c;它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上&#xff0c;所以我们就需要有一定的安全措施来保证接口…...

服务器的管理口和业务口

服务器管理接口和业务接口 服务器管理接口&#xff08;Server Management Interface&#xff0c;SMI&#xff09;&#xff1a; 服务器管理接口是一种用于管理服务器硬件和操作系统的标准接口。它通常用于远程管理和监控服务器&#xff0c;包括但不限于以下功能&#xff1a; …...

【gpt redis】原理篇

用的黑马程序员redis课程的目录&#xff0c;但是不想听讲了。后续都是用gpt文档获取的。 1.课程介绍(Av766995956,P145) 2.Redis数据结构-动态字符串(Av766995956,P146) sds 1M是个界限 其实他是个由c语言实现的结构体 有这么几个参数 len alloc flag char[] len是实际长度 …...

python二次开发Solidworks:排雷以及如何排雷?

目录 1、重要文档 2、MSDN VARIANTS 3、错误排除实例 3.1 第一个例子 3.2 第二个例子 1、重要文档 SolidWorks API 帮助文档&#xff1a;在 SolidWorks 的安装路径下可以找到本地文件&#xff0c;如 ...\Program Files\SolidWorks Corp\SolidWorks\api\apihelp.chm 。 s…...

广告引擎检索技术快速学习

目录 一、广告系统与广告引擎介绍 &#xff08;一&#xff09;广告系统与广告粗分 &#xff08;二&#xff09;广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 &#xff08;一&#xff09;一般概述 &#xff08;二&#xff09;核心功能架构图 三、标…...

如何快速掌握AMD锐龙隐藏性能:Ryzen SDT调试工具终极指南

如何快速掌握AMD锐龙隐藏性能&#xff1a;Ryzen SDT调试工具终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

告别云服务器:手把手教你用QEMU在Ubuntu 18.04上搭建专属内核调试环境

从零构建QEMU内核调试环境&#xff1a;Ubuntu 18.04下的UEFI开发实战手册 当深夜的调试灯亮起&#xff0c;你是否还在为云服务器高昂的费用和网络延迟苦恼&#xff1f;本文将带你用一台普通Ubuntu机器&#xff0c;打造媲美物理机的内核开发环境。不同于常规教程&#xff0c;我…...

别再让电机烧了!聊聊工业设备中三相电源保护的两种经典电路设计与选型

工业三相电机保护电路设计实战&#xff1a;从原理到工程落地 在空压机房嘈杂的轰鸣声中&#xff0c;老王师傅正对着烧毁的电机摇头叹气——这已经是本月第三台因电源故障报废的设备。类似场景在工业现场屡见不鲜&#xff0c;统计显示超过40%的电机故障源于电源异常&#xff0c;…...

2026年选系统门窗,认准专业工厂的三大理由

系统门窗作为现代建筑节能与安全的重要组成&#xff0c;在2026年迎来了更高的性能需求。面对市场上琳琅满目的门窗品牌&#xff0c;消费者如何做出选择&#xff1f;一个关键标准是&#xff1a;是否选择专业工厂生产的系统门窗。专业工厂意味着更高的产品品质、更严格的工艺标准…...

开源与闭源软件质量对比:工程实践与激励机制才是关键

1. 开源与闭源软件质量之争&#xff1a;一场被误解的辩论最近和几位同行聊起软件质量的话题&#xff0c;不出所料&#xff0c;讨论很快又滑向了那个经典的对立&#xff1a;开源软件和闭源&#xff08;或称专有&#xff09;软件&#xff0c;到底谁的质量更好&#xff1f;场面一度…...

【PyTorch实战】从零构建CNN模型:MNIST手写数字识别全流程解析

1. 环境准备与数据加载 第一次接触PyTorch时&#xff0c;我对着官方文档折腾了半天环境配置。后来发现用Anaconda管理Python环境真是省心&#xff0c;这里分享我的配置经验。建议先安装Anaconda最新版&#xff0c;然后创建专属环境&#xff1a; conda create -n pytorch_env py…...

Neovim集成ChatGPT:AI编程助手插件配置与实战指南

1. 项目概述&#xff1a;当Neovim遇上ChatGPT&#xff0c;一个插件如何重塑你的编码体验 如果你是一个Neovim的深度用户&#xff0c;同时又对AI辅助编程抱有极大的热情&#xff0c;那么你很可能已经听说过或者正在寻找一个完美的结合点。 jackMort/ChatGPT.nvim 这个项目&…...

别再微调模型了!Claude 3.5 Sonnet新增3类零样本指令模板:Prompt工程师的最后护城河正在崩塌?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude 3.5 Sonnet零样本指令能力的范式跃迁 Claude 3.5 Sonnet 在零样本&#xff08;zero-shot&#xff09;场景下展现出前所未有的指令理解与泛化能力&#xff0c;标志着大模型从“模式复现”向“意图…...

scp 命令的使用方法 什么软件支持 .git bash xshell .openssh

scp 命令的使用方法 什么软件支持 .git bash xshell .openssh scp backup.sh deploy.sh rollback.sh userserver:/path/to/project/ 这个命令主要在 ‌Linux‌、‌macOS‌ 或 ‌Windows (10/11)‌ 的 ‌命令行终端&#xff08;Terminal / Command Prompt / PowerShell&#xff…...

superpowers skill 3.1: using-git-worktrees

智能体工作流 安装 $ npx skills add https://github.com/obra/superpowers --skill using-git-worktrees摘要 具有智能目录选择和安全验证的隔离 Git 工作树。 通过检查现有目录、CLAUDE.md 偏好设置或询问用户来自动检测工作树目录位置&#xff1b;支持项目本地&#xff…...