代码随想录-刷题第四十八天

news2024/9/23 21:25:33

198. 打家劫舍

题目链接:198. 打家劫舍

思路:当前房屋偷与不偷取决于前一个房屋和前两个房屋是否被偷了。这里就更感觉到,当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。动态规划五步曲:

  1. dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。

  2. 递推公式:dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i])

    如果不偷第i房间,那么dp[i] = dp[i - 1],即考虑i-1房,(注意这里是考虑,并不是一定要偷i-1房,这是容易混淆的点

    如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出下标为i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i - 2] 加上第i房间偷到的钱。

    然后dp[i]取最大值

  3. 初始化:从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值,即:dp[1] = max(nums[0], nums[1])

  4. 遍历顺序:dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前向后遍历!

  5. 举例推导dp数组

    以输入[2,7,9,3,1]为例。

    198.打家劫舍

    红框dp[nums.length - 1]为结果。

class Solution {
    public int rob(int[] nums) {
        // dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
        int[] dp = new int[nums.length];
        // 递推公式:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
        
        if (nums.length == 1) return nums[0];
        // 初始化
        dp[0] = nums[0];
        dp[1] = nums[1] > nums[0] ? nums[1] : nums[0];
        // 遍历顺序
        for (int i = 2; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[nums.length - 1];
    }
}

213. 打家劫舍 II

题目链接:213. 打家劫舍 II

思路:只需要考虑两种情况,包含第一家但是不包含最后一家,或者包含最后一家但是不包含第一家,其他思路与上一题相同。

class Solution {
    public int rob(int[] nums) {
        // 考虑两种情况,包含第一家不包含最后一家,包含最后一家不包含第一家
        if (nums.length == 1) return nums[0];
        int result1 = robRange(nums, 0, nums.length - 2);
        int result2 = robRange(nums, 1, nums.length - 1);
        return Math.max(result1, result2);
    }
    
    // 198.打家劫舍的逻辑
    int robRange(int[] nums, int start, int end) {
        if (end == start) return nums[start];
        int[] dp = new int[nums.length];
        dp[start] = nums[start];
        dp[start + 1] = Math.max(nums[start], nums[start + 1]);
        for (int i = start + 2; i <= end; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[end];
    }
}

337. 打家劫舍 III

题目链接:337. 打家劫舍 III

思路:本题一定是要后序遍历,因为需要根据递归的返回值来做下一步计算。本题是一道树形dp的题目,因为需要在树的结构上进行状态转移。以递归三部曲为主,融合动态规划五步曲进行分析。

  1. 确定递归函数的参数和返回值

    要求一个节点偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。

    返回数组就是dp数组。**dp数组(dp table)以及下标的含义:**下标为0记录不偷该节点所得到的最大金钱,下标为1记录偷该节点所得到的最大金钱。

  2. 确定终止条件

    在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回,这也相当于dp数组的初始化。

  3. 确定遍历顺序

    首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。

    通过递归左节点,得到左节点偷与不偷的金钱。

    通过递归右节点,得到右节点偷与不偷的金钱。

  4. 确定单层递归的逻辑

    如果不偷当前节点,那么就可以偷左右孩子,但是还要选出最大的,res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1])

    如果偷了当前节点,那么,左右孩子就都不能偷,res[1] = node.val + left[0] + right[0]

  5. 举例推导dp数组

    以示例1为例,dp数组状态如下:(注意用后序遍历的方式推导

    img

    最后头结点就是取 下标0 和 下标1 的最大值就是偷得的最大金钱。

class Solution {
    public int rob(TreeNode root) { // 树形dp,后序递归
        // 一个二维的dp数组,代表偷当前节点和不偷当前节点所盗取的最高金额
        int[] res = robAction(root);
        return Math.max(res[0], res[1]);
    }

    int[] robAction(TreeNode node) {
        int[] res = new int[2];
        if (node == null) return res;
        int[] left = robAction(node.left);
        int[] right = robAction(node.right);
        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        res[1] = node.val + left[0] + right[0];
        return res;
    }
}

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

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

相关文章

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

噬菌体序列分析工具PhaVa的使用和使用方法

github: 25280841/PhaVa: Adapting the phasefinder approach for identifying phase variation to long reads (github.com) 挺简单的&#xff0c;这里就不翻译了&#xff0c;大家看着直接用吧。 PhaVa PhaVa is an approach for finding potentially Phase Variable invert…

11.2 Linux串口驱动框架

tty 驱动程序框架 tty 驱动程序从下往上分别是设备驱动层、行规程、终端虚拟化、TTY I/O层&#xff0c;它们的功能如下&#xff1a; 设备驱动层&#xff1a;用于驱动设备&#xff0c;如串口、显示器、键盘等。行规程&#xff1a;用于处理控制字符、回显输入数据、缓存输入数据…

状态机(有限状态机(Finite State Machine, FSM)、推进自动机(Pushdown Automata)、并发状态机、分层状态机)

文章目录 状态机&#xff08;State Machine&#xff09;定义与组成定义组成状态&#xff08;States&#xff09;事件&#xff08;Events&#xff09;转换&#xff08;Transitions&#xff09;初始状态&#xff08;Initial State&#xff09; 状态机的类型有限状态机&#xff08…

Spark MLlib简介与机器学习流程

在大数据领域&#xff0c;机器学习是一个关键的应用领域&#xff0c;可以用于从海量数据中提取有价值的信息和模式。Apache Spark MLlib是一个强大的机器学习库&#xff0c;可以在分布式大数据处理环境中进行机器学习任务。本文将深入介绍Spark MLlib的基本概念、机器学习流程以…

MediaPipeUnityPlugin Win10环境搭建(22年3月的记录,新版本已完全不同,这里只做记录)

https://github.com/homuler/MediaPipeUnityPlugin You cannot build libraries for Android with the following steps. 1、安装msys2配置系统环境变量Path添加 C:\msys64\usr\bin 执行 pacman -Su 执行 pacman -S git patch unzip 2、安装Python3.9.10 勾选系统环境变量 …

LINUX服务器防火墙nf_conntrack问题一例

一、故障现象 业务反馈服务异常,无法响应请求&#xff0c;从系统日志 dmesg 或 /var/log/messages 看到大量以下记录&#xff1a;kernel: nf_conntrack: table full, dropping packet. 二、问题分析 业务高峰期服务器访问量大&#xff0c;内核 netfilter 模块 conntrack 相关参…

Docker 发布自定义镜像到公共仓库

Docker 发布自定义镜像到公共仓库 引言 Docker 是一种轻量级、便携式的容器化技术&#xff0c;可以使应用程序在不同环境中更加可移植。在本文中&#xff0c;我们将学习如何使用 Docker 从公共仓库拉取 Nginx 镜像&#xff0c;定制该镜像&#xff0c;添加自定义配置文件&…

1.4 SPEEDING UP REAL APPLICATIONS

我们从并行化应用程序中可以期待什么样的速度&#xff0c;这取决于应用程序中可以并行化的部分。如果可并行化部分所花费时间的百分比为30%&#xff0c;则并行部分的100倍加速将使执行时间减少不超过29.7%。整个应用程序的加速速度将仅为1.4倍左右。事实上&#xff0c;即使在并…

C语言编译器(C语言编程软件)完全攻略(第二十六部分:C-Free使用教程(使用C-Free编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十六、C-Free使用教程&#xff08;使用C-Free编写C语言程序&#xff09; 1、安装C-Free 5.0 C-Free 是一款国产的Windows下的C/C IDE&#xff0c;最新版本是 5.0&#xff0c;整个软件才 14M&#xff0c;非常轻巧&#xff0c;安装…

vue3项目中axios的常见用法和封装拦截(详细解释)

1、axios的简单介绍 Axios是一个基于Promise的HTTP客户端库&#xff0c;用于浏览器和Node.js环境中发送HTTP请求。它提供了一种简单、易用且功能丰富的方式来与后端服务器进行通信。能够发送常见的HTTP请求&#xff0c;并获得服务端返回的数据。 此外&#xff0c;Axios还提供…

大学物理-实验篇——测量误差与数据处理(测量分类、误差、有效数字、逐差法)

目录 测量分类 测量次数角度 测量条件角度 误差 误差分类 系统误差 随机误差 异常值 误差描述 精密度&#xff08;Precision&#xff09; 正确度&#xff08;Trueness&#xff09; 准确度/精确度&#xff08;Accuracy&#xff09; 随机误差的处理 直接测量 算术…

阻止持久性攻击改善网络安全

MITRE ATT&CK框架是一个全球可访问的精选知识数据库&#xff0c;其中包含基于真实世界观察的已知网络攻击技术和策略。持久性是攻击者用来访问系统的众多网络攻击技术之一;在获得初始访问权限后&#xff0c;他们继续在很长一段时间内保持立足点&#xff0c;以窃取数据、修改…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建一个TcpConnection实例 以及 接收客户端数据

#CSDN 年度征文&#xff5c;回顾 2023&#xff0c;赢专属铭牌等定制奖品# 一、主线程反应堆模型的事件添加和处理详解 >>服务器和客户端建立连接和通信流程&#xff1a; 基于多反应堆模型的服务器结构图&#xff0c;这主要是一个TcpServer&#xff0c;关于HttpServer,…

目标检测-One Stage-EfficientDet

文章目录 前言一、EfficientNetEfficientNet-B0 baselineMBConv 参数优化EfficientNet B0-B7 参数 二、EfficientDetBiFPN复合缩放方法 总结 前言 EfficientDet是google在2019年11月发表的一个目标检测算法系列&#xff0c;其提出的背景是&#xff1a;之前很多研究致力于开发更…

【面试高频算法解析】算法练习5 深度优先搜索

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…

华为bgp之多级RR及团体属性、正则表达式多种应用案例

1、实现总部和分部的oa、财务网段互通 2、分部之间oa也能互通 3、分部之间不能互通财务 主要用到bgp自定义团体属性、一级二级RR配置、bgp正则表达式匹配规则 R1 router id 1.1.1.1 //配全局地址池&#xff0c;又可以给ospf用也可以给bgp用 interface GigabitEthernet0/0/0 …

紫光展锐5G扬帆出海 | 欧洲积极拥抱更多5G选择

和我国一样&#xff0c;欧洲不少国家也在2019年进入5G商用元年&#xff1a;英国在2019年5月推出了5G商用服务&#xff0c;该国最大的移动运营商EE(Everything Everywhere)最先商用5G&#xff1b;德国在2019年年中推出5G商用服务&#xff0c;德国电信、沃达丰和 Telefonica是首批…

【AI视野·今日NLP 自然语言处理论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 1 Jan 2024 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Principled Gradient-based Markov Chain Monte Carlo for Text Generation Authors Li Du, Afra Amini, Lucas…

php-ffmpeg运用 合并视频,转码视频

下载 官网 windows 版本 添加环境变量 合并视频 public function test_that_true_is_true(): void{ini_set(memory_limit,-1); //没有内存限制set_time_limit(0);//不限制执行时间//ffmpeg配置$path [ffmpeg.binaries > D:\soft\ffmpeg\bin/ffmpeg.exe,ffprobe.binaries…