代码随想录算法训练营第四十八天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

news2024/12/23 4:55:01

文章目录

      • 198.打家劫舍
      • 213.打家劫舍II
      • 337.打家劫舍III

198.打家劫舍

  • 题目链接:代码随想录

  • 解题思路:
    1.dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i] 只是考虑,不一定偷
    2.递推公式:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]),根据选不选i位置,由两个方面推导而来
    3.dp数组如何初始化。因为递推公式是dp[i-1]和dp[i-2],所以初始化要考虑dp[0]和dp[1]
    因为要取最大值,所以dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1])
    4.遍历顺序:从前向后。因为后面状态由前面推出来

public int rob(int[] nums) {

    if(nums.length == 1){
        return nums[0];
    }

    //1.定义dp数组,dp数组表示dp[i],考虑i位置的情况下能打劫到的最大价值
    //这里dp[i]中的i代表不一定选第i个位置的数字
    int[] dp = new int[nums.length];

    //2.初始化
    dp[0] = nums[0];
    dp[1] = Math.max(nums[0], nums[1]);
    //3.遍历
    for (int i = 2; i < dp.length; i++) {
        //根据选不选i位置的数值
        //选,只能加上dp[i-2]的数值
        dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
    }

    //4.最后返回递推的结果
    return dp[nums.length - 1];
}

213.打家劫舍II

关键点:将环形问题的情况分解成线性问题的情况,进而求解

  • 题目链接:代码随想录

  • 解题思路:
    ①根据环形问题,分为三种情况一种不考虑首尾,一种考虑首不考虑尾,最后一种考虑尾不考虑首
    后两种情况考虑首不考虑尾就包含了不考虑首尾的问题,因此只用将最后两种打家劫舍问题求一个和即可
    编写一个有参数的打家劫舍函数,里面进行初始化和相应范围的打家劫舍问题的分析。
    要想编写容易,要借用自动扩容的ArrayList数组,dp范围和nums范围和位置一致

  • 三种状态

    Snipaste_2023-05-01_21-51-56 Snipaste_2023-05-01_21-52-06 Snipaste_2023-05-01_21-52-22
public int rob(int[] nums) {
    int len = nums.length;
    //保证len从3开始
    if(len == 1){
        return nums[0];
    }
    if(len == 2){
        return Math.max(nums[0], nums[1]);
    }

    return Math.max(robAction(nums, 0, len - 2),robAction(nums, 1, len - 1));

}

/**
     * 考虑[start,end]位置房屋的打家劫舍问题
     * @param nums
     * @param start
     * @param end
     * @return
     */
private int robAction(int[] nums, int start, int end) {
    //定义dp数组的时候,要选用可扩容的ArrayList,因为要保证dp数组下标值和nums数组下标值一样
    List<Integer> dp = new ArrayList<>(nums.length);
    for(int i = 0;i < dp.size();i++){
        dp.add(0);
    }
    //初始化
    dp.set(start, nums[start]);
    dp.set(start + 1, Math.max(nums[start], nums[start + 1]));
    for (int i = start + 2; i <= end; i++) {
        dp.set(i, Math.max(dp.get(i - 2) + nums[i], dp.get(i - 1)));
    }

    return dp.get(end);
}
public static void main(String[] args) {
    List<Integer> dp = new ArrayList<>(2);
    System.out.println(dp.size());//0  这里只有首次添加元素之后,size1才变化
    dp.add(0, 0);
    System.out.println(dp.size());//1
}

337.打家劫舍III

本题是树形dp的入门级别的题目,通过返回dp数组来保存遍历状态 也称状态标记递归,通过一个标记,来记录遍历过程中的最大值

  • 题目链接:代码随想录

  • 解题思路:
    1.确定递归函数的参数和返回值
    那么返回值就是一个长度为2的dp数组。dp[0]表示不偷当前节点情况下的金钱dp[1]偷当前节点情况下的金钱,参数为当前节点,将当前节点偷与不偷得到的金钱返回给上一层
    在递归过程中,系统栈会保存每一层递归的参数,因此每一个节点的dp数组经过分析汇聚给root
    2.终止条件
    遇到空节点,直接返回本层偷的结果{0,0}
    3.确定遍历顺序:
    采用后序遍历,因为要根据左右节点的偷的金钱状态,根节点判断当前根偷还是不偷
    这种需要依靠状态的,都需要采取后序遍历
    4.确定单层递归逻辑:
    如果偷当前节点,那么dp[1] = root.val + 左右节点不偷的金钱
    如果不偷当前节点,那么左右节点可以偷,也可以不偷,因此dp[0] = max([0],[1])(左右节点)

  • 推导过程:

    Snipaste_2023-05-01_23-34-31
public int rob(TreeNode root) {
    int[] dp = robAction1(root);

    return Math.max(dp[0], dp[1]);
}


/**
     * 递归树
     * @param root
     * @return 一个dp一维数组
     */
private int[] robAction1(TreeNode root){
    //本层dp状态数组
    int[] dp = new int[2];
    //终止条件
    if(root == null){
        return dp;
    }

    int[] leftDp = robAction1(root.left);
    int[] rightDp = robAction1(root.right);

    //本根不偷
    dp[0] = Math.max(leftDp[0], leftDp[1]) + Math.max(rightDp[0], rightDp[1]);
    //本根偷
    dp[1] = root.val + leftDp[0] + rightDp[0];

    //返回本层偷与不偷的状态
    return dp;
}

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

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

相关文章

【STM32CubeMX】F103外部中断

前言 本文记录下我学习STM32CubeMX时的流程&#xff0c;方便以后回忆。系统板是基于STM32F103C6T6。本章记录外部中断。 步骤 该实验步骤以&#xff0c;配置PA1为外部中断下降沿触发事件&#xff0c;在触发事件后点亮板载PC13LED灯 时钟配置和生成文件配置之类的&#xff0c;其…

3.6 cache存储器

学习步骤&#xff1a; 我会采取以下几个步骤来学习Cache存储器&#xff1a; 确定学习目标&#xff1a;Cache存储器作为一种高速缓存存储器&#xff0c;通常用于提高计算机系统的运行效率。因此&#xff0c;我需要明确学习Cache存储器的目的&#xff0c;包括了解其原理、结构和…

No.054<软考>《(高项)备考大全》【冲刺8】《软考之 119个工具 (6)》

《软考之 119个工具 &#xff08;6&#xff09;》 99.应急应对策略:100.风险在评估:101.风险审计:102.偏差和趋势分析:103.技术绩效测量:104.自制或外购分析:105.市场调研:106.投标人会议:107.建议书评价技术:108.独立核算:109.广告:110.采购谈判:111.合同变更控制系统:112.采购…

定位图像坐标系和角度误区

坐标系和角度的常见误区 在学习halcon的时候.常常看文档的时候,会有一些地方比较疑感有些常用的地方有细微的差距,一不留意。就会导致计算的数据出错 常见的误区就在坐标系和角度 halcon的帮助情况 存在Px,Py 大家不要被搞混乱 Px -> Row Py-> Column 很多人定位项…

C语言——字符串及字符函数的介绍

C语言——字符串及字符函数的介绍 一、字符函数1.strlen1.1strlen的使用1.2strlen的三种模拟实现1.2.1计数器实现strlen函数1.2.2递归方法实现strlen函数1.2.3指针方法实现strlen函数 1.3 注意事项 2.strcpy2.1strcpy使用2.2strcpy的模拟实现2.3strcpy的注意事项 3.strcat3.1st…

【小样本分割 2022 ECCV】SSP

文章目录 【小样本分割 2022 ECCV】SSP摘要1. 介绍2. 相关工作3. 自支持小样本语义分割3.1 动机3.2 自支持原型-SSM3.3 自适应自支持背景原型-ASBP3.4 自支持匹配-SSL 3. 代码 【小样本分割 2022 ECCV】SSP 论文题目&#xff1a;Self-Support Few-Shot Semantic Segmentation 中…

SpringCloud 微服务系列——【Gateway、Config组件使用】

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

第二十三章 材质

3D模型主要是通过材质&#xff08;Material&#xff09;和贴图&#xff08;Texture&#xff09;来表现其精美的外表&#xff0c;说白了就是一张“画皮”而已。我们之前的DirectX课程中介绍过材质&#xff0c;它实际就是对光的反射率&#xff0c;这样简单的设置并不能展现3D模型…

Linux线程 概念、特点、线程间资源共享情况

1. 线程概念 线程是轻量级的进程&#xff1b;Linux中&#xff0c;线程本质上仍是进程。 进程是OS分配资源的最小单位&#xff0c;线程是OS调度的最小单位。 NPTL 当前Linux线程库为redHat开发的NPTL&#xff0c;查看本地线程库版本&#xff1a; getconf GNU_LIBPTHREAD_VE…

【C++】三元操作符、创建并初始化C++对象、C++new关键字

C的三元操作符 if的语法糖 例1 #include <iostream> #include <string>static int s_Level 1; static int s_Speed 2;int main() {if (s_Level > 5){s_Speed 10;}else{s_Speed 5;}std::cin.get(); }用三元操作符&#xff1a; s_Speed s_Level > 5 ?…

基础篇-并发篇

**63.线程状态 添加主线程和子线程 ** 65.线程状态 核心线程和任务队列都是有上限的&#xff0c;所以都满了话就开始使用救急线程; 救急线程也是有上限的&#xff0c;如果再来新的线程的话就需要拒绝策越; 注意&#xff1a;这里不需要等待5000ms&#xff0c;几乎是同时打印 注…

[230503] 2021年托福阅读真题第1篇|Grinding Grain 磨粒

11:21&#xff5e;11:41 慢 20min 正确率&#xff1a;6.5/10 题目来源&#xff1a;链接: https://pan.baidu.com/s/15FYCuD7__slfGvdsBIHgLQ 提取码: iynj --来自百度网盘超级会员v5的分享【内含2021年100篇托福阅读真题】 目录 Grinding Grain 题目 Grinding Grain It now…

2016 ICPC合肥站 传递 HDU-5961(拓扑排序 / bitset / 暴力(可hack))

题目链接&#xff1a;HDU-5961 传递 中文题面就不解释题目意思&#xff0c;解释一下名词的意思 完全图&#xff1a;对于一个无向图 G G G 而言&#xff0c;设点集为 V V V&#xff0c;点集中任意不相同两点 u , v u, v u,v 间都有且仅有一条边叫做完全图。 竞赛图&#xff1…

【玩转Git三剑客笔记】第一章 Git基础

第一章 Git基础 1.综述2.安装Git3.使用Git之前需要做的最小配置4.创建第一个仓库并配置local用户信息1.创建Git仓库2.设置Git最小配置 5.通过几次commit来认识工作区和暂存区1.将工作区中所有已经被git追踪的文件一起添加到暂存区2.git log查看提交日志 6.给文件重命名的简便方…

密码学【java语言】初探究

文章目录 前言一 密码学1.1 古典密码学1.1.1 替换法1.1.2 移位法1.1.3 古典密码破解方式 二 近代密码学2.1 现代密码学2.1.1 散列函数2.1.2 对称密码2.1.3 非对称密码 二 凯撒加密的实践2.1 基础知识&#xff1a;ASCII编码2.2 ascii编码演示2.3 凯撒加密和解密实践2.4 频率分析…

安装Ubuntu22.04虚拟机的一些常见问题解决方法

文章目录 VirttalBox 开启共享剪切板文件夹、拖放的功能VirtualBox 安装 ubuntu后安装增强工具无效的解决办法解决ubuntu您没有权限查看“ 某某文件夹”的内容所需的权限linux更换源的两种方法[如何在 Ubuntu 20.04 上安装 Visual Studio Code - ](https://zhuanlan.zhihu.com/…

【Java入门合集】第二章Java语言基础(二)

【Java入门合集】第二章Java语言基础&#xff08;二&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…

权限提升:不带引号服务路径 || 不安全的服务权限.

权限提升&#xff1a;不带引号服务路径 || 不安全的服务权限. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动…

Nature:李龙等揭示抑郁症模型中社交压力阻断社交奖赏的神经环路机制

在人类社会中&#xff0c;社会压力尤其是创伤性社会经历会导致抑郁症、社交焦虑及创伤后应激障碍等多种精神疾病【1】。在抑郁症研究领域&#xff0c;有研究表明社会创伤会损害大脑负责奖赏的脑区功能&#xff0c;使社交活动变得不再有奖赏性&#xff0c;从而导致严重的社交回避…

【ShenYu系列】ShenYu Dubbo插件全流程源码解析

网关启动 在ShenyuConfiguration注入ShenyuWebHandler。 Bean("webHandler")public ShenyuWebHandler shenyuWebHandler(final ObjectProvider<List<ShenyuPlugin>> plugins, final ShenyuConfig config, Lazy final ShenyuLoaderService shenyuLoaderS…