leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化
关于此题我的往期文章,动规五部曲详解篇:
leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客
https://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 翻译成递推:
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 翻译成递推:
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)优化空间复杂度
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);}
};
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博客
https://heheda.blog.csdn.net/article/details/133409962leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推-CSDN博客
https://blog.csdn.net/weixin_41987016/article/details/134179583?spm=1001.2014.3001.5501leetCode 198.打家劫舍 动态规划 + 优化空间复杂度_呵呵哒( ̄▽ ̄)"的博客-CSDN博客
https://blog.csdn.net/weixin_41987016/article/details/133390944?spm=1001.2014.3001.5501
相关文章:
leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化
关于此题我的往期文章,动规五部曲详解篇: leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133409962213. 打家劫舍 II - 力扣&#x…...
网络编程套接字(二)
目录 简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求单执行流服务器的弊端 多进程版TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务多线程版的TCP网络程序客户端创建套接字客户端链接服务器客户端发起请求 线程池版的TCP网络程序 简单的T…...
[极客大挑战 2019]Knife 1(两种解法)
题目环境: 这道题主要考察中国菜刀和中国蚁剑的使用方法 以及对PHP一句话木马的理解 咱们先了解一下PHP一句话木马,好吗? **eval($_POST["Syc"]);** **eval是PHP代码执行函数,**把字符串按照 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秒: 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时间按秒、分、时、日、月、年作差 按秒: 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个参数,N,M,K 怪兽有N滴血,等着英雄来砍自己 英雄每一次打击,都会让怪兽流失[0~M]的血量 到底流失多少?每一次在[0~M]上等概率的获得一个值 求K次打击之后,英雄把怪兽砍死的概率。 暴…...
java EE 进阶
java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …...
记录paddlepaddle-gpu安装
背景 由于最近需要使用paddleocr,因此需要安装依赖paddlepaddle-gpu,不管怎么安装cuda11.6-11.8安装了一遍,都无法正常安装成功。如下所示: 环境: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,请剪除该二叉树中所有节点的值全都是0的子树。例如,在剪除图8.2(a)中二叉树中所有节点值都为0的子树之后的结果如图8.2(b)所示。 分析 下面总结什么样的节…...
云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)
0x00 k8s简介 k8s(Kubernetes) 是容器管理平台,用来管理容器化的应用,提供快速的容器调度、弹性伸缩等诸多功能,可以理解为容器云,不涉及到业务层面的开发。只要你的应用可以实现容器化,就可以部…...
性能压力测试主要目标及步骤
性能压力测试是软件开发生命周期中至关重要的一部分,旨在评估应用程序或系统在高负载和极端条件下的性能表现。这种测试有助于发现性能瓶颈、资源耗尽和错误,以确保应用程序在真实使用情况下的可靠性和稳定性。本文将探讨性能压力测试的概念、方法和最佳…...
VLAN与配置
VLAN与配置 什么是VLAN 以最简单的形式为例。如下图,此时有4台主机处于同一局域网中,很明显这4台主机是能够直接通讯。但此时我需要让处于同一局域网中的PC3和PC4能通讯,PC5和PC6能通讯,并且PC3和PC4不能与PC5和PC6通讯。 为了实…...
API接口安全设计
简介 HTTP接口是互联网各系统之间对接的重要方式之一,使用HTTP接口开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上,所以我们就需要有一定的安全措施来保证接口…...
服务器的管理口和业务口
服务器管理接口和业务接口 服务器管理接口(Server Management Interface,SMI): 服务器管理接口是一种用于管理服务器硬件和操作系统的标准接口。它通常用于远程管理和监控服务器,包括但不限于以下功能: …...
【gpt redis】原理篇
用的黑马程序员redis课程的目录,但是不想听讲了。后续都是用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 帮助文档:在 SolidWorks 的安装路径下可以找到本地文件,如 ...\Program Files\SolidWorks Corp\SolidWorks\api\apihelp.chm 。 s…...
广告引擎检索技术快速学习
目录 一、广告系统与广告引擎介绍 (一)广告系统与广告粗分 (二)广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 (一)一般概述 (二)核心功能架构图 三、标…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
