TikTok真题第1天 | 666.路径和IV、 207.课程安排、210.课程安排

666.路径和IV

题目链接:666.路径和IV

解法:

参考这篇题解:【LeetCode - 666】路径和 IV_力扣666路径总和4-CSDN博客

关键点在于:

(1)使用map来存node:key 为整数的前两位,value 为整数的后一位,即 key 为位置信息,value 为权值,KV是(num / 10, num % 10);

(2)左右子树的表示:对于某一个节点来说,如果它的深度为depth,位置编号为 pos,那么它的左子节点的深度为depth+1,位置编号为 pos × 2 - 1,那么key就是 (depth+1) * 10 + pos*2-1。而它的右子节点的pos和key都是左子节点的加1;

(3)如果左子节点和右子节点均不在 map 中,说明一条路径计算完毕,ans += sum;

(4)如果两个子节点中有一个不在map中,那么dfs会直接对该子节点return,否则继续dfs。

边界条件:左子树或者右子树为空。

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {int ans = 0;// 使用unordered_map,插入、删除和查找的平均时间复杂度为O(1)// 而map是有序的,这三种操作为O(logn)unordered_map<int,int> map;public:int pathSum(vector<int>& nums) {for (int num: nums) {map[num / 10] = num % 10;}dfs(nums[0]/10, 0);return ans;}private:void dfs(int node, int sum) {auto it = map.find(node);if (it == map.end()) {return;}sum += it->second;int depth = node / 10;int pos = node % 10;int left = (depth + 1) * 10 + pos * 2 - 1;int right = left + 1;if (map.find(left)==map.end() && map.find(right)==map.end()) {ans += sum;} else {dfs(left, sum);dfs(right, sum);}}
};

207.课程表

题目链接:207.course-schedule

解法:

两种解法,bfs和dfs。

bfs:需要提前计算所有课的入度和先修课的邻接表,入度为0的课意味着没有任何先修课,可以先选。剩下的看题解,这篇题解写得很好:bfs题解。

代码的实现参考这篇题解:bfs代码

dfs:在构造邻接表时,有的答案是把先修课作为vector的索引或者map的key,也有的把先修课作为vector的元素。这里按前一种,把先修课作为vector的索引,得从先修课开始选,根据先修课再去遍历以它为前置条件的课程,直到搜索到某门课不是任何课程的先修课,说明从当前课开始dfs的路径,是有限无环的。

以下题解来自eetcode中文区:dfs代码

边界条件:

时间复杂度 O(N+M): 遍历一个图需要访问所有节点和所有临边,N 和 M分别为节点数量和临边数量;
空间复杂度 O(N+M): 为建立邻接表所需额外空间,adjacency 长度为 N ,并存储 M条临边的数据。

// bfs
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adjacency(numCourses);vector<int> indegrees(numCourses, 0);queue<int> que;for (const auto& cp:prerequisites) {adjacency[cp[1]].push_back(cp[0]);indegrees[cp[0]]++;}for (int i=0; i<numCourses; i++) {if (indegrees[i]==0) que.push(i);}while (!que.empty()) {int pre = que.front();que.pop();numCourses--;for (int cur: adjacency[pre]) {indegrees[cur]--;if (indegrees[cur]==0) que.push(cur);}}return numCourses == 0;}
};
// dfs
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adjacency(numCourses);vector<int> flags(numCourses, 0);for (const auto& cp:prerequisites) {adjacency[cp[1]].push_back(cp[0]);}for (int i=0; i<numCourses; i++) {if (!dfs(adjacency, flags, i)) return false;}return true;}private:bool dfs(const vector<vector<int>>& adjacency, vector<int>& flags, int i) {if (flags[i] == 1) return false;if (flags[i] == -1) return true;flags[i] = 1;for (int j: adjacency[i]) {if (!dfs(adjacency, flags, j)) return false;}flags[i] = -1;return true;}
};

210. 课程表||

题目链接:210.course-schedule-ii

解法:

与207几乎一样,代码改动量很小。如果不先做207,那几乎是搞不懂的。

dfs改动大一些,result需要翻转一下,因为先修课是最后才加入列表的。

边界条件:

时间复杂度:同207

空间复杂度:同207

// bfs
class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adjacency(numCourses);vector<int> indegrees(numCourses, 0);queue<int> que;vector<int> result;for (const auto& cp:prerequisites) {adjacency[cp[1]].push_back(cp[0]);indegrees[cp[0]]++;}for (int i=0; i<numCourses; i++) {if (indegrees[i]==0) que.push(i);}while (!que.empty()) {int pre = que.front();que.pop();result.push_back(pre);for (int cur: adjacency[pre]) {indegrees[cur]--;if (indegrees[cur]==0) que.push(cur);}}if (result.size()!=numCourses) return {};return result;}
};
// dfs
class Solution {vector<int> result;public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adjacency(numCourses);vector<int> flags(numCourses, 0);for (const auto& cp:prerequisites) {adjacency[cp[1]].push_back(cp[0]);}for (int i=0; i<numCourses; i++) {if (!dfs(adjacency, flags, i)) return {};}// 要翻转reverse(result.begin(), result.end());return result;}private:bool dfs(const vector<vector<int>>& adjacency, vector<int>& flags, int i) {if (flags[i] == 1) return false;if (flags[i] == -1) return true;flags[i] = 1;for (int j: adjacency[i]) {if (!dfs(adjacency, flags, j)) return false;}flags[i] = -1;result.push_back(i);return true;}
};

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

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

相关文章

龙芯loongarch64服务器编译安装paddlepaddle

前言 PaddlePaddle (Parallel Distributed Deep Learning,中文名飞桨)是百度公司推出的开源,易学习,易使用的分布式深度学习平台,现阶段各行各业均追求国产化,软件行业也一样,所有需要在龙芯服务器上编译安装paddlepaddle。 官方教程 官方教程里面很多没有讲解到,安…

SQL编写规范及性能排查一些方法

SQL 语句编写规范 避免使用select *&#xff0c;对于宽表来说&#xff0c;这是灾难&#xff1b;严禁不加任何where条件读取数据&#xff1b;MySQL中的text类型字段独立存储&#xff0c;数据量少的表除外&#xff1a;Where条件中的过滤条件字段上严禁使用任何函数&#xff0c;包…

ubuntu 搭建本地私有pip源

# 搭建本地私有pip源 pip install pip2pi# 创建目录 mkdir /data/work/PyPip/ mkdir /data/work/PyPip/packages cd /data/work/PyPip/# 创建需要从外网源同步的package touch requirements_roop.txt# 批量同步 pip2tgz /data/work/PyPip/packages -r requirements_roop.txt# 同…

【JS】按照a>b>c>d>e>f的优先级,将a,b,c,d,e,f元素进行筛选,选出三个不为空字符的元素进行字符拼接

设计思路&#xff1a; 1、定义一个数组&#xff0c;把元素按照优先级进行排序&#xff1b; 2、 使用 filter() 方法过滤掉空字符串元素&#xff0c;得到一个新的数组; 3、在排序函数中&#xff0c;循环数组&#xff0c;使用 indexOf() 方法获取元素 a 和 b 在数组中的索引&a…

描述一个bug及定义bug的级别

&#xff08;一&#xff09;描述一个bug 描述一个bug&#xff0c;需要以下几个因素&#xff1a; 故障标题、故障发现的版本、故障类别&#xff08;功能/兼容/界面&#xff09;、故障优先级、故障描述&#xff08;测试环境、测试步骤、预期结果、实际结果&#xff09;。 举个例…

spring的SPI机制之使用SpringFactoriesLoader加载服务实现

SpringFactoriesLoader提供了一种工厂方式供spring容器来加载特定的服务。像java的SPI一样&#xff0c;约定固定的配置文件和格式&#xff0c;使用SpringFactoriesLoader进行按需加载。只不过SpringFactoriesLoader读取的配置文件位置 “META-INF/spring.factories”。这个文件…

C++的作用域详细解读

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、作用域是什么&#xff1f;二、作用域类别1.全局作用域&#xff08;global scope&#xff09;2.名字空间作用域&#xff08;namespace scope&#xff09;3.局…

使用Exchanger线程之间交换数据

public class ExchangeThread {static class Producer implements Runnable{//生产者、消费者交换的数据结构private List<String> buffer;//步生产者和消费者的交换对象private Exchanger<List<String>> exchanger;Producer(List<String> buffer,Exch…

MySQL,使用Union组合查询

1、基本使用 Union可将多条select语句组合成一个结果集&#xff0c;常见的使用场景有2种&#xff1a; 在单个查询中&#xff0c;从不同的表返回类似结构的数据&#xff1b;对单个表执行多个查询&#xff0c;按单个查询返回数据。 例&#xff1a;检索出所有价格<50的产品&…

批发订货系统小程序怎么推广 四个方案高效获客

微信小程序基于强社交属性&#xff0c;天然自带引流特性&#xff0c;但毕竟小程序也只是一个工具&#xff0c;想要快速获客&#xff0c;还是需要商家主动采取一些措施的。下面分享是个方法&#xff0c;尤其是最后一个&#xff0c;是十分凑效的。大家点个关注点个赞&#xff0c;…

Android 权限申请

在Android中&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限&#xff1a; 在应用的清单文件&#xff08;AndroidManifest.xml&#xff09;中声明需要的权限。例如&#xff0c;如果应…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 inference.py官方示例 简介 原始链接&…

Mysql的基础问题原理

存储引擎&#xff1a; 存储引擎是Inndb。它支持行级锁&#xff0c;以及表级锁&#xff0c; 支持事务操作&#xff0c; 需要主键&#xff0c;若未声明主键&#xff0c;则会寻找表中的 not null 以及 unique 修饰的字段。若表中无此类字段&#xff0c;会隐式生成字段。 索引&…

解决win10下强制设置web浏览器为microsoft edge的方法

目录 问题场景实现方法禁止edge默认选项设置默认浏览器 反思 问题场景 因为一些特殊的原因&#xff0c;我需要第二个浏览器&#xff0c;我的第一个浏览器是google的chrome浏览器&#xff0c;所以我选择的是windows的默认浏览器&#xff0c;就是microsoft edge浏览器&#xff0…

UI Grounding 学习笔记

学习资料 【OpenMMLab社区开放麦讲座】《颠覆性创新&#xff1a;多模态对话与精准区域分割 - VPGTrans & NExT-Chat》 1. 学术关键字 LLM Detection 2. 相关论文 InstructBLIP&#xff1a;指令微调RT-DETRVPGTrans: Transfer Visual Prompt Generator across LLMs (Ne…

【Java】Mybatis

MyBatis JavaEE三层框架&#xff1a;表现层、业务层、持久层。 现在开始学习持久层。持久层就是负责与数据库打交道的代码。 框架&#xff1a;就是一个半成品软件。在框架的基础上&#xff0c;可以更加高效地写出代码。 1、MyBatis快速入门 1、准备工作&#xff08;创建sp…

SpringMVC配置文件

springMVC-servlet.xml springMVC配置 放在resources下 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http://www.springframework.org/schema/context&quo…

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天&#xff0c;在【百度智能云智算大会】上&#xff0c;百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台&#xff0c;可以…

【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]

阅读导航 引言一、Mutex的简介二、Mutex的种类1. std::mutex &#xff08;基本互斥锁&#xff09;2. std::recursive_mutex &#xff08;递归互斥锁&#xff09;3. std::timed_mutex &#xff08;限时等待互斥锁&#xff09;4. std::recursive_timed_mutex &#xff08;限时等待…

【沁恒蓝牙mesh】CH58x DataFlash 详解

本文主要介绍了 沁恒蓝牙芯片 CH58x 的 DataFlash 分区以及读写操作以及原理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博…