leetcode 1466

2023-12-08 17:20
文章标签 leetcode 1466

本文主要是介绍leetcode 1466,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

leetcode 1466

在这里插入图片描述
如图 node 4 -> node 0 -> node 1
因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线,都需要修改,反之,如果是通向0的节点,例如节点4,则把节点4当作父节点的节点,之间的路线的方向都需修改。
两个节点间只有一条方向,所以可以确定如何修改,取决和0节点的关系。

如图 node 0 -> node 1 -> node 3 <- node 2
dfs (0, -1, e) -> dfs (1, 0, e) -> dfs(3, 1, e)
e[3][0].first = 1 == parent continue;
e[3][1].first = 2 != parent 但是 e[3][1].second =0, 所以不增加长度。

如图 (0 -> 1), 使用 e[0][1] = 1 和 e[1][0] = 0 的表达方式。

数据结构

vector<vector<pair<int, int>>>

这个数据结构是一个二维的向量(vector),其中每个元素都是一个pair<int, int>类型的元素。可以将其理解为一个邻接表的表示方式。

具体来说,这个数据结构可以表示一个有n个顶点的图,其中每个顶点v都有一个对应的向量e[v],该向量存储了与顶点v相邻的顶点以及它们之间的边的信息。

每个pair<int, int>元素表示一条边,其中第一个int表示与顶点v相邻的顶点,第二个int表示边的权重或其他相关信息。

例如:e[0] = {{1, 2}, {3, 4}},则表示顶点0与顶点1之间有一条权重为2的边,以及顶点0与顶点3之间有一条权重为4的边。
例如: e[0][1] = {1,2}

这种数据结构在表示稀疏图时非常有效,因为它只存储了实际存在的边,而不需要为所有可能的边分配空间。同时,通过使用向量而不是链表,可以提高访问和遍历的效率。

vector<vector > 和 vector<vector<pair<int, int>>>

vector<vector<int>>vector<vector<pair<int, int>>>在内存上的差别主要体现在存储的数据类型和元素的大小上。

对于vector<std::vector<int>>,它是一个二维向量,其中每个元素都是一个一维向量,而每个一维向量存储了一系列int类型的元素。因此,内存中会按照一维向量的方式存储每个元素,每个元素之间是连续存储的。这意味着在内存中,整个二维向量是一段连续的内存空间。

而对于vector<vector<pair<int, int>>>,它也是一个二维向量,但每个元素是一个一维向量,而每个一维向量存储了一系列pair<int, int>类型的元素。因为pair<int, int>占用的内存空间更大,所以每个元素之间的存储空间可能不是连续的,而是分散存储的。

具体来说,对于vector<std::vector<int>>,内存中的存储布局可能类似于以下示意图:

[元素1][元素2][元素3]...

而对于vector<vector<pair<int, int>>>,内存中的存储布局可能类似于以下示意图:

[元素1-1][元素1-2][元素2-1][元素2-2][元素3-1][元素3-2]...

其中,每个元素1-1、1-2、2-1、2-2等表示pair<int, int>类型的元素。

因此,vector<std::vector<int>>在内存上是连续存储的,而vector<vector<pair<int, int>>>可能是分散存储的,每个元素之间的存储空间可能不是连续的。这也是它们在内存上的主要差别。

向量和链表

向量和链表在存储效率上有一些差异,这取决于具体的操作和使用场景。

向量(vector)是一个动态数组,它使用连续的内存块来存储元素。这意味着向量可以通过索引来快速访问元素,并且在尾部进行插入和删除操作的效率也很高。然而,在向量中间进行插入和删除操作可能涉及到移动元素的操作,这会导致效率降低。此外,当向量的大小超过当前分配的内存容量时,可能需要重新分配更大的内存块,并将现有元素复制到新的内存块中,这也会带来一定的开销。

链表(linked list)是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。链表的插入和删除操作在任意位置都很高效,因为它只需要调整节点的指针,而不需要移动其他元素。然而,链表的随机访问效率较低,因为需要从头节点开始遍历链表直到找到目标位置。此外,链表的存储空间相对于向量来说更加分散,因为每个节点需要额外的指针来指向下一个节点。

综上所述,向量适用于需要频繁进行随机访问、尾部插入和删除操作的场景,而链表适用于需要频繁进行插入和删除操作、对随机访问性能要求较低的场景。选择使用哪种数据结构取决于具体的操作和使用需求。

这篇关于leetcode 1466的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/470695

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]