代码随想录算法训练营 ---第四十八天

第一题:

简介:

注:本题简介是我的思路,题解思路看下方。

动态规划五部曲:

1.确定dp数组的含义

 //dp[i]表示 偷到第i家能偷到的最大金额

 for(int i=2;i<nums.size();i++){
            if(i-3>=0)
            dp[i] = max(dp[i-2],dp[i-3])+nums[i];
            else{
                 dp[i] = dp[i-2]+nums[i];
            }
        }

2.确定递归公式

            if(i-3>=0){
                 dp[i] = max(dp[i-2],dp[i-3])+nums[i];
             }
            else{
                 dp[i] = dp[i-2]+nums[i];
            }

3.确定初始化

       dp[0] = nums[0];

        dp[1] = nums[1];

4.确定遍历顺序

    

5.打印数组

题解思路:

  1. 确定dp数组(dp table)以及下标的含义

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

      2 .确定递推公式

       决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1],即考虑i-1房(注意这里是考虑,并不是一定要偷i-1房)然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

     3.dp数组如何初始化

       dp[0] 一定是 nums[0] 

       dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);

  代码如下:

vector<int> dp(nums.size());
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);

   4.确定遍历顺序 

dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历!

代码如下:

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

5.举例推导dp数组

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

198.打家劫舍

代码实现:

class Solution {
public:
    //dp[i]表示 偷到第i家能偷到的最大金额
    int rob(vector<int>& nums) {
        if(nums.size() == 1)return nums[0];
        vector<int> dp(nums.size(),0);
        dp[0] = nums[0];
        dp[1] = nums[1];
        for(int i=2;i<nums.size();i++){
            if(i-3>=0)
            dp[i] = max(dp[i-2],dp[i-3])+nums[i];
            else{
                 dp[i] = dp[i-2]+nums[i];
            }
        }
        return dp.back()>dp[dp.size()-2]?dp.back():dp[dp.size()-2];
    }
};

题解代码实现: 

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[0] = nums[0];
        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

  • 情况二:考虑包含首元素,不包含尾元素

213.打家劫舍II1

  • 情况三:考虑包含尾元素,不包含首元素

213.打家劫舍II2

但是我们可以看出情况二 三都包含了情况一的情况 。所以我们算出情况二 和情况三分别可以获得的最大利益。再进行比较就可以了。

代码实现:

class Solution {
public:
    //偷盗第i家的最大值
    int rob(vector<int>& nums) {
      if (nums.size() == 0) return 0;
        if (nums.size() == 1) return nums[0];
        int result1 = robRange(nums, 0, nums.size() - 2); // 情况二
        int result2 = robRange(nums, 1, nums.size() - 1); // 情况三
        return max(result1, result2);
    }
     int robRange(vector<int>& nums, int start, int end) {
        if (end == start) return nums[start];
        vector<int> dp(nums.size());
        dp[start] = nums[start];
        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];
    }
};

第三题:

简介:

代码随想录:打家劫舍3本题建议看卡哥的视频讲解和题解

代码实现: 

class Solution {
public:
     //dp[0] 表示不偷  dp[1]表示偷
    vector<int> robtree(TreeNode* cur){
        if (cur == NULL) return vector<int>{0, 0};
        vector<int> left = robtree(cur->left);
        vector<int> right = robtree(cur->right);
        // 偷cur,那么就不能偷左右节点。
        int val1 = cur->val + left[0] + right[0];
        // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况
        int val2 = max(left[0], left[1]) + max(right[0], right[1]);
        return {val2, val1};
    }
    int rob(TreeNode* root) {
        vector<int> result = robtree(root);
        return max(result[0], result[1]);
          
    }
};

总结: 

今天有点小崩溃,只做出来一题。需要多多练习,继续加油!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧城市交通大屏|助力解决城市交通问题

2017年起&#xff0c;数字孪生连续三年被Gartner列入“未来科技十大趋势”&#xff0c;由此可见数字孪生技术正屹立在数字化发展的风口之中。 数字孪生作为物理世界的数字映射&#xff0c;将流程、物体的信息利用数字技术实时映射到系统中&#xff0c;可以对某个设备、某个企业…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页&#xff1a;【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录&#xff1a;【挑…

网站纪念哀悼主题风格

前言 在许多情况下&#xff0c;为了表达对逝者的怀念和哀悼&#xff0c;网站会将其风格调整为黑白色。这种做法在一些网站中非常常见&#xff0c;包括一些社交媒体平台和新闻网站等。 当一个网站将其风格调整为黑白色时&#xff0c;这通常意味着它正在为一些悲伤的事件或纪念日…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

线上异步任务突然不能回写100%

项目场景&#xff1a; 需求是一个作业&#xff0c;需要运行一组sql&#xff0c;所有sql运行完成&#xff0c;更新作业进度为100%&#xff0c;状态为完成。sql需要是在大数据平台&#xff0c;通过yarn调度&#xff0c;异步执行。 kafka监听每个sql的执行状态&#xff0c;所有sql…

KaiwuDB 亮相中国 5G + 工业互联网大会,助力新型工业化

11月19-21日&#xff0c;由各相关政府部门共同主办的“2023 中国 5G工业互联网大会”在湖北武汉盛大举行。作为我国“5G工业互联网”领域的国家级顶会&#xff0c;本届大会以“数实融合&#xff0c;大力推进新型工业化”为主题&#xff0c;聚焦新型基础设施、产业转型升级、技术…

树莓派 cpolar实现内网穿透

树莓派 cpolar实现内网穿透 cpolar官网介绍 cpolar官网 树莓派安装cpolar 使用ssh连接树莓派终端&#xff0c;输入以下命令&#xff0c;即可安装cpolar curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash安装完成后可输入cpolar v…

idea 旧项目替换成新项目(项目名称,模块,代码)

文章目录 修改项目名替换模块、文件前缀全局替换包名局部替换xml、yml等其他文件 修改项目名 右击项目名称->Refactor->Rename(shiftF6) ctrlaltshifts 替换模块、文件前缀 git bash执行如下脚本 #/bin/bash # 单目录替换 for f in old-prefix*; do mv "$f…

语音机器人的两种常见业务场景

第一个业务场景 之前写过一篇语音机器人是真人录音好&#xff0c;还是TTS转语音更好的文章。今天再来说一说TTS一个很细微的场景。 假设一句话 这里是*****银行委托机构&#xff0c;您在*****银行的信用卡长期逾期至今仍未依照约定履行还款义务&#xff0c;为避免逃废债给您…

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题&#xff08;重点&#xff0c;也是难点&#xff09;&#xff1a; 地址管理&#xff1b;路由选择。 1.1 子问题1&#xff1a;地址管理 网络上的这些主机和节点都需要使用一种规则来区分&#xff0c;就相当于是一种身…

【javaWeb】HTTP协议

HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议 HTTP 是一个文本格式的协议. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节. 上图是通过Fiddler对访问百度搜索页时抓取的一个http协议的包。 观察抓包结果,可以看到,当前 http…

windows 下gcc编译的软件获取管理员权限

每次运行程序的时候需要管理员权限&#xff0c;一般可以右键管理员模式运行&#xff0c;或者在属性里设置默认管理员权限运行。但是当需要移动执行文件的位置后&#xff0c;必须重新设置管理员权限。这种操作相对来说麻烦&#xff0c;有没有一种办法直接在exe中声明呢&#xff…

vue3父子组件通过$parent与ref通信

父组件 <template><div><h1>ref与$parents父子组件通信 {{ parentMoney }}</h1><button click"handler">点击我子组件的值会减20</button><hr><child ref"children"></child></div> </te…

【机器学习】迁移学习

迁移学习&#xff1a;给定一个有标记的源域和一个无标记的目标域。这两个领域的数据分布不同。迁移学习的目的就是要借助源域的知识&#xff0c;来学习目标域的知识(标签)。或是指基于源域数据和目标域数据、源任务和目标任务之间的相似性&#xff0c;利用在源领域中学习到的知…

redis 集群

redis-cluster集群&#xff1a; redis3.0引入的分布式存储方案 集群由多个node节点组成&#xff0c;redis数据是分布在这写节点之中。 在集群之中分为主节点和从节点。 集群自带哨兵模式 集群模式当中&#xff0c;主从一一对应&#xff0c;数据的写入和读取于主从模式一样&a…

使用opencv将8位图像raw数据转成bmp文件的方法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 这里说的图像raw数据是只包含图像数据的缓存。主要使用了cv::imencode接口将 cv::Mat转化为图像缓存。 #include <opencv2/opencv.hpp>/* 生成一幅…

【单调栈】最大宽度坡

public int maxWidthRamp(int[] nums) {/* 此方法思路正确&#xff0c;但超时int n nums.length;Deque<Integer> stack;int max 0;for (int i 0; i < n; i) {stack new LinkedList<>();stack.push(nums[i]);int j i 1;while (j < n) {stack.push(nums…

Banana Pi最新的路由器板BPI-R4上市销售,基于MediaTek MT7988A

Banana Pi 发布了一款新的路由器板 Banana Pi BPI-R4&#xff0c;基于配备四核 Arm CPU 的 MediaTek MT7988A SoC。该板不仅仅是Raspberry Pi 的另一个替代品&#xff0c;而且是用于家庭网络和自动化的设备。 Banana Pi BPI-R4 的外形尺寸比单板计算机更像网络设备。对于那些希…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》&#xff08;9&#xff09; 4 Linux 进程管理4.5 Linux 信号4.5.1 信号的作用和种类1.信号机制2.信号种类 4.5.2 信号的处理4.5.3 信号处理函数1&#xff0e;数据结构2&#xff0e; 处理函数 signal3&#xff0e;程序例 4 Linux 进…