day48第九章动态规划(二刷)

news2024/9/29 9:31:00

今日任务

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

今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。


198.打家劫舍

题目链接:

https://leetcode.cn/problems/house-robber/description/

题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

题解代码:

class Solution {
public:
    //二刷动规复习
    int rob(vector<int>& nums){
        if(nums.size() == 0){
            //如果没有房间可以偷
            return 0;
        }
        if(nums.size() == 1){
            //如果只有一个房间可以偷
            return nums[0];
        }

        vector<int> dp(nums.size()); //dp数组,dp[i]表示考虑下标i(包括i)以内的房间,最多可以偷窃的金额为dp[i]
        dp[0] = nums[0]; //初始化dp数组
        dp[1] = max(nums[0],nums[1]);

        for(int i = 2; i < nums.size(); i++){
            //开始进行偷窃
            dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
        }
        return dp[nums.size()-1];
    }

    //一刷动规
    /*
    int rob(vector<int>& nums) {
        if(nums.size() == 0){//没有房间可以偷
            return 0;
        }
        if(nums.size() == 1){//只有一间房可以偷
            return nums[0];

        }

        vector<int> dp(nums.size()); //dp数组,dp[i]表示考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
        dp[0] = nums[0]; //初始化dp数组
        dp[1] = max(nums[0],nums[1]);

        for(int i = 2; i < nums.size(); i++){//开始进行偷窃
            dp[i] = max(dp[i-2]+nums[i], dp[i-1]);

        }

        return dp[nums.size()-1];

    }
    */
};

213.打家劫舍II

题目链接:

https://leetcode.cn/problems/house-robber-ii/description/

题目描述:

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

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

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

题解代码:

class Solution {
public:

    int rob(vector<int>& nums){
        if(nums.size() == 0){
            //如果没有房间可以偷
            return 0;
        }

        if(nums.size() == 1){
            //如果只有一个房间可以偷
            return nums[0];
        }

        int res1 = robRange(nums, 0, nums.size()-2); //含首不含尾
        int res2 = robRange(nums,1,nums.size()-1); //含尾不含首
        return max(res1, res2);

    }

    int robRange(vector<int>& nums, int start, int end){
        if(start == end){
            //如果nums数组中只有一个元素
            return nums[start];
        }

        vector<int> dp(nums.size());//dp数组,dp[i]表示 考虑下标i(包括i)以内的房屋,最多可以偷盗的金额为dp[i]
        dp[start] = nums[start]; //dp数组初始化
        dp[start+1] = max(nums[start], nums[start+1]);

        for(int i = start+2; i <= end; i++){
            dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[end];
    }

    

    //一刷动规
    /*
    int rob(vector<int>& nums) {
        if(nums.size() == 0){ //如果没有房间可以偷
            return 0;
        }
        if(nums.size() == 1){//如果只有一个房间可以偷
            return nums[0];

        }

        int res1 = robRange(nums,0,nums.size()-2); //含首不含尾
        int res2 = robRange(nums,1,nums.size()-1); //含尾不含首
        return max(res1,res2);

    }

    //198打家劫舍的逻辑,基本一致,只是增加了范围限制
    int robRange(vector<int>& nums, int start, int end){
        if(start==end){ //如果nums数组中只有一个元素
            return nums[start];
        }
        vector<int> dp(nums.size()); //dp数组,dp[i]表示 考虑下标i(包括i)以内的房屋,最多可以偷盗的金额为dp[i]
        dp[start] = nums[start]; //dp数组初始化
        dp[start+1] = max(nums[start], nums[start+1]);

        for(int i = start+2; i <= end; i++){
            dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
        }

        return dp[end];
    }
    */

};

213.打家劫舍III

题目链接:

https://leetcode.cn/problems/house-robber-iii/description/

题目描述:

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:

https://assets.leetcode.com/uploads/2021/03/10/rob1-tree.jpg

输入:root = [3,2,3,null,3,null,1]
输出: 7
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

https://assets.leetcode.com/uploads/2021/03/10/rob2-tree.jpg

输入:root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

题解代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //二刷动规
    int rob(TreeNode* root){
        vector<int> res = robTree(root);
        return max(res[0], res[1]);
    }

    //长度为2的数组,0不偷,1表示偷
    vector<int> robTree(TreeNode* cur){
        //处理特殊情况
        if(cur == NULL){
            //如果当前节点是空节点
            return vector<int>{0,0}; //不管是偷还是不偷,都是0
        }

        //处理左
        vector<int> left = robTree(cur->left);
        //处理右
        vector<int> right = robTree(cur->right);

        //处理根节点
        //偷cur,则不能偷它的左右孩子
        int val_1 = cur->val + left[0] + right[0];
        //不偷cur,则可以偷 也可以不偷 它的左右孩子, 具体还是根据最大情况来选择
        int val_2 = max(left[0], left[1]) + max(right[0], right[1]);

        return {val_2, val_1};
    }

    //一刷动规
    /*
    int rob(TreeNode* root) {
        vector<int> res = robTree(root);
        return max(res[0],res[1]);

    }

    //长度为2的数组,0 不偷, 1表示偷
    vector<int> robTree(TreeNode* cur){
        //处理特殊情况
        if(cur == NULL){ //如果当前节点是空结点,
            return vector<int>{0,0}; //不管偷还是不偷,都是0
        }

        //处理左
        vector<int> left = robTree(cur->left);
        //处理右
        vector<int> right = robTree(cur->right);

        //处理根结点
        //偷cur,则不能偷它的左右孩子
        int val_1 = cur->val + left[0] + right[0];
        //不偷cur,则可以偷 也可以不偷 它的左右孩子, 具体还是根据最大情况来选择
        int val_2 = max(left[0], left[1]) + max(right[0], right[1]);

        return {val_2,val_1};
    }
    */

    
};

总结

复习复习。

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

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

相关文章

synchronized轻量级锁优化

synchronized优化轻量级锁 使用场景 如果一个对象虽然有多个线程访问&#xff0c;但多线程访问时间是错开的&#xff0c;也就是没有竞争&#xff0c;那么可以使用轻量级锁优化&#xff1b; 原理 1、每个线程的栈帧中有锁记录 包括&#xff1a;记录锁对象的地址Object refer…

一次有效沟通的组成

犹记得之前看过一篇文章当中写道 『Tech Lead 作为开发团队的技术负责人&#xff0c;对内对外都起到至关重要的作用。Tech Lead 对外是团队技术能力的展现窗口&#xff0c;需要将团队的技术能力呈现给客户或业务团队。对内他需要和各个角色紧密协作&#xff0c;给非技术角色技术…

50年前的程序员女神,用代码把人类送上月球

1969年7月20日&#xff0c;经过4天飞行的阿波罗11号终于来到了最关键的时刻&#xff1a;降落到月球表面。就在这个时候&#xff0c;飞船计算机突然开始闪烁报警。全球6亿人在观看电视直播&#xff0c;NASA飞行控制中心的气氛让人窒息。人类的首次登月计划面临着艰难的抉择&…

d3绘图笔记

D3绘图笔记 安装与引用 npm install d3 --save-dev import * as d3 from d3; 选择器 d3.select() 可直接接元素名&#xff0c;也可以接属性与类 添加svg标签 this.d3 d3.select(.myd3) let svg this.d3.append("svg") // 添加svg并设置好高宽 .attr("wid…

<Linux>system v通信

前言&#x1f603;&#x1f603;&#x1f603;进程间通信的方式管道 - Linux原生提供SystemV - 多线程单机通信posix - 多线程网络通信这里我们主要是介绍一下SystemV通信方式一、SystemV原理首先我们需要知道通信的本质&#xff1a;多个进程能看到同一个资源&#xff0c;即内存…

如何使用码匠连接 CouchDB

目录 在码匠中集成 CouchDB 在码匠中使用 CouchDB 关于码匠 CouchDB 是一种开源的 NoSQL 数据库服务&#xff0c;它使用基于文档的数据模型来存储数据。CouchDB 的数据源提供了高度可扩展性、高可用性和分布式性质。它支持跨多个节点的数据同步和复制&#xff0c;可以在多个…

mysql数据库之表级锁

表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生所冲突的概率最高&#xff0c;并发度最低。应用在myisam、innodb、bdb等存储引擎中。 一、表级锁分类。 1、表锁 2、元数据锁&#xff08;meta data lock&#xff0c;MDL&#xff09; 3、意向锁 二、表锁…

yum保留安装包

一. 用downloadonly下载 1.1 处理依赖关系自动下载到/tmp/pages目录&#xff0c;pages这个目录会自动创建 yum install --downloadonly --downloaddir/tmp/pages ceph-deploy注意&#xff0c;如果下载的包包含了任何没有满足的依赖关系&#xff0c;yum将会把所有的依赖关系包下…

微信小程序的代码由哪些结构组成?

小程序官方建议把所有小程序的页面&#xff0c;都存放在pages 目录中&#xff0c;以单独的文件夹存在&#xff0c;如图所示&#xff1a; 其中&#xff0c;每个页面由4 个基本文件组成&#xff0c;它们分别是&#xff1a;js文件(页面的脚本文件&#xff0c;存放页面的数据、事件…

Bean三种实例化方式的底层原理

Bean实例化的三种方式 1&#xff0c;使用类构造器实例化&#xff08;无参构造函数&#xff09;2&#xff0c;使用静态工厂方法实例化&#xff08;简单工厂模式&#xff09;3&#xff0c;使用实例工厂方法实例化&#xff08;工厂方法模式&#xff09; 基于以上的三种方式&…

时间轮来优化定时器

在raft协议中&#xff0c; 会初始化三个计时器是和选举有关的&#xff1a; voteTimer&#xff1a;这个timer负责定期的检查&#xff0c;如果当前的state的状态是候选者&#xff08;STATE_CANDIDATE&#xff09;&#xff0c;那么就会发起选举 electionTimer&#xff1a;在一定时…

Photoshop如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件呢&#xff1f;有一些小伙伴不会安装&#xff0c;今天介绍两种安装ZXP扩展的方法&#xff0c;希望对能帮助到大家。方法一&#xff1a;手动安装方式1&#xff09;把下载好的.zxp扩展名改为.zip&#xff0c;然后解压。Windows系统&#xff1a;C:\Us…

参考文献去哪里查找,参考文献标准格式是什么

1、参考文献类型&#xff1a; 普通图书[M]、期刊文章[J]、报纸文章[N]、论文集[C]、学位论 文[D]、报告[R]、标准[s]、专利[P]、数据库[DB]、计算机程序[CP]、电 子公告[EB]、联机网络[OL]、网上期刊[J&#xff0f;OL]、网上电子公告[EB&#xff0f;OL]、其他未 说明文献[z]。…

I.MX6ULL_Linux_驱动篇(28) 字符设备驱动

字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI&#xff0c;LCD 等等都是字符设备&#xff0c;这…

蓝牙耳机品牌哪个质量好?2023质量好的蓝牙耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机凭借更方便地使用而受到不少人的喜爱&#xff0c;蓝牙耳机各种性能的发展也越来越先进。哪个品牌的蓝牙耳机质量好&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款质量好的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳…

接口请求参数异常之@RequestParam

问题 具体问题如下&#xff1a; 正确的如下&#xff1a; 如上两图所示&#xff1a;我们的请求参数是pageNo和pageSize&#xff0c;但是却没有正确显示&#xff0c;则说明我们的接口存在了问题。 分析问题 参数为什么没有正确的显示每页显示条数和当前页数&#xff0c;而是我…

jmeter-定时器

记录下业务中常用的定时器概念以及使用流程&#xff0c;仅供自己学习。 定时器的作用域 1、定时器是在每个sampler&#xff08;采样器&#xff09;之前执行的&#xff0c;而不是之后&#xff08;无论定时器位置在sampler之前还是下面&#xff09;&#xff1b; 2、当执行一个sa…

Apache HTTP Server <2.4.56 mod_proxy 模块存在请求走私漏洞(CVE-2023-25690)

漏洞描述 Apache HTTP Server是一款Web服务器。 该项目受影响版本存在请求走私漏洞。由于intro.xml中存在RewriteRule配置不当&#xff0c;当Apache启用mod_proxy且配置如 RewriteRule “^/here/(.*)” " http://example.com:8080/elsewhere?$1"; http://example.…

Elasticsearch 核心技术(七):IK 中文分词器的安装、使用、自定义字典

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、安装 IK 分词器方式一&#xff1a;自行下载并解压安装包方式二&#xff1a;…

【前端学习】D3:CSS进阶

文章目录前言系列文章目录1 CSS的三大特性1.1 层叠性1.2 继承性1.3 优先级&#xff08;*&#xff09;2 盒子模型2.1 看透网页布局的本质2.2 盒子模型&#xff08;Box Model&#xff09;的组成2.3 边框&#xff08;border&#xff09;2.3.1 普通边框2.3.2 表格的细线边框2.3.3 边…