算法训练(leetcode)第三十四天 | 56. 携带矿石资源(第八期模拟笔试)、198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

刷题记录

  • *56. 携带矿石资源(第八期模拟笔试)
  • 198. 打家劫舍
  • 213. 打家劫舍 II
  • *337. 打家劫舍 III
    • 解法一 (记忆化递推)
    • *解法二 (动态规划)

*56. 携带矿石资源(第八期模拟笔试)

leetcode题目地址

多重背包问题可以拆解成01背包问题。

时间复杂度: O ( m ∗ n ∗ k ) O(m*n*k) O(mnk)
空间复杂度: O ( n ) O(n) O(n)

// c++
#include<bits/stdc++.h>
using namespace std;
int main(){int c,n;cin>>c>>n;vector<int> weight(n, 0);vector<int> value(n, 0);vector<int> nums(n, 0);vector<int> dp(c+1, 0);for (int i = 0; i < n; i++) cin >> weight[i];for (int i = 0; i < n; i++) cin >> value[i];for (int i = 0; i < n; i++) cin >> nums[i];for(int i=0; i<n; i++){for(int j=c; j>=weight[i]; j--){for(int k=1; k<=nums[i]&&(j-k*weight[i]>=0); k++){dp[j] = max(dp[j], dp[j-k*weight[i]]+k*value[i]);}}}std::cout << dp[c] << std::endl;return   0;                                                                 
}

198. 打家劫舍

leetcode题目地址

dp[i]存储到第i个房屋时的最大价值。

每个房屋有两个状态:取或不取。若取,则当前房屋的最大价值是dp[i-2]+nums[i];若不取,则当前房屋的最大价值是前一个房屋的最大价值。因此状态转移方程为: d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) dp[i] = max(dp[i-2]+nums[i], dp[i-1]) dp[i]=max(dp[i2]+nums[i],dp[i1])

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:int rob(vector<int>& nums) {if(nums.size()==1) return nums[0];vector<int> dp(nums.size(), 0);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

leetcode题目地址

使用两个dp数组分别记录取头不取尾取尾不取头。其他逻辑和上一题一致。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:int rob(vector<int>& nums) {if(nums.size()==1) return nums[0];// 取nums[0]vector<int> dp(nums.size(), 0);// 不取nums[0]vector<int> dp1(nums.size(), 0);dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);dp1[1] = nums[1];for(int i=2; i<nums.size()-1; i++){dp[i] = max(dp[i-2]+nums[i], dp[i-1]);}for(int i=2; i<nums.size(); i++){dp1[i] = max(dp1[i-2]+nums[i], dp1[i-1]);}return max(dp[nums.size()-2],dp1[nums.size()-1]);}
};

*337. 打家劫舍 III

leetcode题目地址

解法一 (记忆化递推)

使用二叉树的后序遍历来求是否加入当前节点,使用一个map来记录已经求过的结点值。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( l o g n ) O(logn) O(logn)

// c++
/*** 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:// 记录计算过的结果,保证每个结点只计算一次unordered_map<TreeNode*, int> umap;int rob(TreeNode* root) {if(!root) return 0;if(!root->left && !root->right) return root->val;// 当前节点已计算过,直接返回if(umap[root]) return umap[root];// 取根int val1 = root->val;if(root->left) val1 += rob(root->left->left) + rob(root->left->right);if(root->right) val1 += rob(root->right->left) + rob(root->right->right);// 不取根int val2 = rob(root->left) + rob(root->right);// 记录当前结果umap[root] = max(val1,val2); return max(val1,val2); // return 0;}
};

*解法二 (动态规划)

使用二叉树的后序遍历来计算左右孩子节点的取与不取的价值,再计算当前节点的取与不取,返回结果。

思路

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( l o g n ) O(logn) O(logn)

// c++ 
/*** 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:vector<int> robTree(TreeNode* root){if(!root) return {0, 0};vector<int> left = robTree(root->left);vector<int> right = robTree(root->right);// 偷当前节点,孩子节点不可偷int val1 = root->val + left[0] + right[0];// 不偷当前节点,孩子节点可偷可不偷int val2 = max(left[0], left[1]) + max(right[0], right[1]);return {val2, val1};}int rob(TreeNode* root) {vector<int> res = robTree(root);return max(res[0], res[1]);}
};

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

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

相关文章

防火墙USG2000USG5000配置nat server 时 no-reverse的含义

防火墙USG2000&USG5000配置nat server 时 no-reverse的含义 https://forum.huawei.com/enterprise/zh/thread/580888066099396608?page2 多次执行带参数no-reverse的nat server命令&#xff0c;可以为该内部服务器配置多个公网地址&#xff1b;未配置参数no-reverse则表…

实现代码灵活性:用Roslyn动态编译和执行存储在数据库中的C#代码

在许多现代应用程序中&#xff0c;动态编译和执行代码是提升灵活性和功能的一种强大技术。本文将介绍如何使用Roslyn编译器平台动态编译和执行存储在数据库中的C#代码&#xff0c;并结合实际公司案例来说明这些技术的应用场景。 1. 引言 在很多应用场景中&#xff0c;我们可能…

牛客周赛53---DEF

D.小红组比赛 题目描述 \,\,\,\,\,\,\,\,\,\,小红希望出一场题目&#xff0c;但是他的实力又不够&#xff0c;所以他想到可以从以前的比赛中各抽一题&#xff0c;来组成一场比赛。不过一场比赛的难度应该是有限制的&#xff0c;所以所以这一场比赛会给一个目标难度分数 target…

docker笔记7-dockerfile

docker笔记7-dockerfile 一、dockerfile介绍二、dockerfile指令三、构建自己的镜像 一、dockerfile介绍 Dockerfile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成的脚本。 以下是常用的 Dockerfile 关键字的完整列表和说明&#xff1a; 二、docker…

Vue3自研开源Tree组件 - Vitepress文档功能演示

基于自己学习的一点Vue3和ts的知识&#xff0c;写的一个企业级的开源Tree组件&#xff0c;给大伙儿演示下组件功能和API的使用&#xff0c;如果您喜欢&#xff0c;不妨点赞和关注下&#xff0c;后续会继续分享源码教程&#xff0c;感谢支持&#xff01; 演示视频地址&#xff…

【计算机毕业设计】838装修公司CRM系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于微信小程序的高校大学生信息服务平台设计与实现

基于微信小程序的高校大学生信息服务平台设计与实现 Design and Implementation of a College Student Information Service Platform based on WeChat Mini Program 完整下载链接:基于微信小程序的高校大学生信息服务平台设计与实现 文章目录 基于微信小程序的高校大学生信息…

【Python】基础学习技能提升代码样例7:代码测试

1. doctest doctest用于测试 # 文件外命令测试 # file name: foo.py """ My square function. Usage: >>> a my_square(4) >>> b my_square(3) >>> a b 25 """ def my_square(num):return num * num > pytho…

为什么要做边界值测试?

边界值测试的理解 边界值测试&#xff08;Boundary Value Testing&#xff09;是一种常用的软件测试方法&#xff0c;它侧重于测试输入值的边缘或临界条件。这些边缘条件通常包括最小值、最大值以及接近这些最小值和最大值的值。边界值测试的基本思想是&#xff0c;许多软件错…

React 学习——Context机制层级组件通信

核心思路&#xff1a;&#xff08;适用于所有层级&#xff0c;不仅仅是爷孙 父子&#xff09; createContext方法创建一个上下文对象在顶层组件 通过Provider组件提供数据在底层组件&#xff0c;通过useContext钩子函数使用数据 import { createContext, useContext } from …

R语言 爬取数据+简单清洗

小小练习。见代码注释 # 加载必要的包 library(rvest) library(dplyr) library(tidyr)# 指定网页URL url <- "https://research.un.org/en/unmembers/scmembers"# 读取网页内容 webpage <- read_html(url)# 提取所有表格节点 table_nodes <- html_nodes(web…

vite查漏补缺

一、静态资源处理 //png txt后缀的文件不会检测是否存在&#xff0c;js json vue文件会检测是否存在 import test from "/assets/imgs/test1.png" console.log(test); // /src/assets/imgs/test1.png返回图片的绝对路径// 显式加载资源为一个 URL import test fr…

如何设置SQL Server的端口:详细步骤指南

如何设置SQL Server的端口&#xff1a;详细步骤指南 在SQL Server中&#xff0c;配置端口是确保数据库服务能够正确通信的重要步骤。无论是为了提高安全性还是满足特定的网络配置需求&#xff0c;正确设置SQL Server的端口都是必要的。本文将详细介绍如何设置SQL Server的端口…

深入理解Java中的volatile关键字

深入理解Java中的volatile关键字 1. 引言 在Java多线程编程中,volatile关键字扮演着重要角色。它能够保证变量的可见性和有序性,是实现线程安全的重要工具之一。本文将深入探讨volatile的实现原理,以及与之密切相关的指令重排概念。 2. volatile的作用 volatile关键字主要有…

基于人工智能及大数据的综合智能交通管理平台(可编辑30页PPT)

引言&#xff1a;随着城市化进程的加速和汽车保有量的快速增长&#xff0c;交通拥堵、交通事故频发以及交通资源分配不均等问题日益突出&#xff0c;成为制约城市发展的重要因素。为了应对这些挑战&#xff0c;基于人工智能&#xff08;AI&#xff09;及大数据技术的综合智能交…

【React】详解自定义 Hook

文章目录 一、自定义 Hook 的基本用法1. 什么是自定义 Hook&#xff1f;2. 创建自定义 Hook3. 使用自定义 Hook 二、自定义 Hook 的进阶应用1. 处理副作用2. 组合多个 Hook3. 参数化 Hook4. 条件逻辑 三、自定义 Hook 的实际应用案例1. 实现用户身份验证2. 实现媒体查询 四、最…

民大食堂用餐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;档口号管理&#xff0c;商家餐品管理&#xff0c;餐品种类管理&#xff0c;购物车管理&#xff0c;订单信息管理 微信端账号功能包括&#xff1a;系统首页&a…

学懂C语言(二十六):学会C语言 typedef 关键字的应用

用一句话来说&#xff0c;typedef为已存在的数据类型创建 新的类型 别名。 typedef是C语言中的一个关键字&#xff0c;用于为已存在的数据类型创建新的类型别名。它能提高代码的可读性、可维护性以及便于跨平台移植。以下是typedef关键字在C语言中的几种常见应用&#xff1a; …

angular入门基础教程(七)系统路由

路由的实现 当我们系统越来复杂&#xff0c;功能越来越多&#xff0c;路由也就是必须的了。在 ng 中如何实现路由呢&#xff1f; 启用路由 在 app 目录下&#xff0c;新建一个 router 目录&#xff0c;把 app.routers.ts 文件拷贝过来&#xff0c;并修改一下。 import { Ro…

PostgreSQL 之 to_timestamp函数

to_timestamp 是 PostgreSQL 中的一个函数&#xff0c;用于将字符串或数字转换为时间戳。以下是关于 to_timestamp 的详细介绍&#xff1a; 引入版本 to_timestamp 函数在 PostgreSQL 7.3 版本中引入。 语法 to_timestamp 有两种主要的用法&#xff1a; 1.将字符串转换为时间…