
数据结构相关算法题
文章平均质量分 68
C+G
也就那样
展开
-
ST表详解(稀疏表)
文章目录ST表简介动态规划的预处理(以2为倍数增加长度)区间查询的方法例题一:ST表模板题例题二:ST表变式例题例题三:ST表的思想解决多数求gcdST表简介ST表(Sparse Table,稀疏表)是一种简单的数据结构,主要用来解决RMQ(Range Maximum/Minimum Query,区间最大/最小值查询)问题。它主要应用倍增的思想,可以实现 O(nlogn) 预处理、O(1) 查询。所谓RMQ问题,以最大值为例,是假如有一个数列 A ,给你一个区间 [l , r] ,要求 max(A_i原创 2021-09-02 21:41:34 · 4412 阅读 · 3 评论 -
前缀树(Trie)两种方式实现详解--C++数据结构的实现
文章目录动态前缀树的实现Trie_dyn.hTrie_dyn.cpp静态前缀树的实现Trie_static.hTrie_static.cpp前缀树的好处动态前缀树的实现动态前缀树实现的关键在于利用指针的动态分配,但这也带来了一个问题,内存的释放问题。所以我们采用将每一个申请的内存空间通过vector进行存储,最后方便释放。Trie_dyn.h//// Created by Alone on 2021/8/3.//#ifndef MY_TINY_STL_TRIE_DYN_H#define原创 2021-08-03 21:59:40 · 341 阅读 · 0 评论 -
关于最小生成树的一切
文章目录初识最小生成树切分定理切分定理的证明Kruskal 算法(以边扩散)练习题--连接所有点的最小费用解题代码Prim算法(以顶点扩散)「Kruskal 算法」和 「Prim 算法」区别时间复杂度空间复杂度练习题--连接所有点的最小费用解题代码初识最小生成树首先,小伙伴们可能要冒出第一个问题了。什么是生成树?生成树 指的是「无向图」中,具有该图的 全部顶点 且 边数最少 的连通子图。「图8. 生成树」中,所有粉色线条组成的一棵树[(A, B), (A, C), (A, D), (A, E)],就是该原创 2021-07-31 23:28:13 · 483 阅读 · 0 评论 -
关于并查集的一切全在这里了
文章目录并查集初识「并查集」常用术语「并查集」基本思想「并查集」的两个实现方式Quick Find 方式实现并查集Quick Find工作原理:代码实现与验证时间复杂度Quick Union 方式实现并查集Quick Union的工作原理为什么 Quick Union 比 Quick Find 更加高效?代码实现与验证时间复杂度按秩合并优化并查集视频讲解代码实现与验证路径压缩优化的并查集视频讲解代码实现(路径压缩+按秩合并)综合运用例题并查集初识如果给你一些顶点,并且告诉你每个顶点的连接关系,你如何才能原创 2021-07-30 19:50:32 · 310 阅读 · 0 评论 -
满二叉树的性质题--二叉树寻路
文章目录题目题目解析解题代码题目题目解析我们审题可知,这是一棵编号不正常的满二叉树,而看到满二叉树,我们需要想到这几个性质:满二叉树第 i 层的结点数为 2i−12^{i-1}2i−1个。满二叉树从第1层到第 i 层所有的结点数为 2i−12^{i}-12i−1 个。满二叉树和完全二叉树的编号为 i 的结点,他的父节点是 i/2i/2i/2,子节点是 i∗2i*2i∗2 和 i∗2+1i*2+1i∗2+1。(前提是每层的顺序一致)回到该题,我们发现,它的编号顺序并不是一致的,而是按原创 2021-07-29 15:41:54 · 212 阅读 · 0 评论 -
哈希表在遍历链式结构中的运用--以链表和二叉树的遍历为例
文章目录题目一:在二叉树中遍历的运用题目解析解题代码题目二:在链表遍历中的运用题目解析解题代码题目一:在二叉树中遍历的运用题目解析关于如何找到和某个结点距离为 k 的结点,我们很快可以想到用递归实现,但是很快意识到这种方式只能求出到根节点的距离为 k 的所有结点,所以如果以这种方式只能求取在 target 下面距离的结点,而无法向上遍历,那么该如何实现向上遍历呢?答案是----哈希表我们根据哈希表存储每个结点的父节点,这样我们只需要在遍历二叉树时进行特殊的判断,即可实现向上遍历而不回头。原创 2021-07-28 16:46:02 · 182 阅读 · 0 评论 -
两数之和再进化--大餐计数(哈希表的利用)
文章目录题目题目解析优化前代码优化后代码题目题目解析读完题目可能大部分人直接暴力两层循环开干,可惜只能通过一半,要是暴力法能过,那也不可能标记为中等题了。转换思路:我们转换成:两数之和为2的幂的个数,一看到两数之和我们很快会想到利用哈希表的 O(n) 解决方案,我们通过哈希表的 key 记录已扫描过的值, value 记录相同值的个数,然后每次通过查找 target-nums[i] 即可算出两数之和为 target 的次数,而这道题就出现在这个 target 不是很确定,但它一定是2的幂,所原创 2021-07-07 17:00:11 · 109 阅读 · 0 评论 -
(实战类编程题)点菜展示表实现--利用哈希表作值
文章目录题目题目解析逐步解析代码建立哈希表映射数组记录数据并排序更新table(copy函数的使用)整合答案做题收获题目题目解析读完题目,我们需要确定的有三点:菜品名目。2. 顾客所在餐桌号。3. 该餐桌号该类菜品需要的数目。题目中还要求,菜品名目需要按照字典序排序,所在餐桌号也需要如此。根据以上解读我们可以给出以下方法进行逐一解决:建立哈希表用于记录映射关系:创建以哈希表为 value 的哈希表,通过餐桌号来索引到另一个哈希表,另一哈希表用于记录这一桌所点的菜的种类对应的原创 2021-07-06 23:34:23 · 199 阅读 · 0 评论 -
数据结构题实操题:利用后序遍历的特点寻找最近公共祖先
文章目录题目题目解析解题代码解题代码题目OJ平台题目解析公共祖先一共会出现四种种情况:给出的两个结点在 root 结点的左右子树,则最近公共祖先就是 root 。给出的两个结点都在左子树,则最近公共祖先是左子树中先搜到的那个结点。给出的两个结点都在右子树,则最近公共祖先是右子树中先搜到的那个结点。左右子树都未找到给出的 p、q 结点,则不存在。由于都是通过先处理左右子树寻找,然后再在根节点处进行返回操作,这很明显就是一个后序遍历的过程,后序遍历的过程就是先处理左右子树然后再回到原创 2021-06-29 09:59:45 · 549 阅读 · 0 评论 -
两数相加(链表)递归当while用hhh
文章目录题目:分析题目普通递推法:递归法yyds题目:分析题目这种数位分开模拟手算过程的加法,一般都逆序存储各个位置方便进位。本位 = (a+b+up)%10进位 = (a+b+up)/10普通递推法:class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *head = nullptr, *tail = nullptr; int原创 2021-05-10 23:34:27 · 166 阅读 · 0 评论 -
颠倒数字的二进制位
题目如题所示,颠倒数字的二进制位。。比如1001=>1001哦好像还是不变哦。。再比如1100=>0011就是将位反转。解题与思考(含图片解析):我们应该做过将数组的数据反转。。我们是利用双指针来进行。那这个数字的二进制位我们也能这样吗?很明显不行的。。但是可以类似于链表的反转,将它一位一位的取下来再拼上去。图解我们需要解决两个个问题:如何从二进制数中取下最右边的数?利用和1相与如n&1如何拼接呢?利用与0相或再左移可以不断的拼接代码实现:cl原创 2021-04-29 20:29:02 · 317 阅读 · 0 评论 -
两种位运算的方式解决位1的个数
题目:给出一个二进制数,计算二进制数中的1的个数。方法一:利用左移右移左移:可将1左移与数字按位&右移:将数字右移与1按位&注意用for循环控制循环32次。//右移实现class Solution {public: int hammingWeight(uint32_t n) { int count = 0; for(int i=0;i<32;i++){ if(n>>i&1)原创 2021-04-29 18:09:05 · 693 阅读 · 0 评论 -
Leetcode简单题--罗马数字转整数
题目:解决方法的思考:我们根据这么多个罗马数字的对应表不难想到应该使用switch–case来匹配不同的情况。当我们匹配不同情况的时候难免会遇到两个字符表示一个数字的特殊情况。我们这里可以采取两个方式处理特殊情况。<1>我们可以从头扫到尾部,用pre变量记录前一个数字,用cur记录当前的,当我们处理V、X、L、C、D、M时,对当前要返回的值进行判断,如果上一个数是对应的二数字前缀所代表的数字时,就将结果为当前数字减去两次前缀的数字。<2>我们可以一旦扫到I、X、原创 2021-04-29 17:05:18 · 132 阅读 · 0 评论 -
简单的报数游戏(只是记录一下写蓝桥杯题目的过程)。。。
关于题目:报数游戏的题目无非就是,报到多少就停止报数又从1开始报数,而报到特定的数字就出队,。。最后一般就是问最后的队列情况。。套路这种题目肯定是离不开队列这个数据结构的,为了维持一个报数的环境,那么每次的队列头部肯定都得是那个报数的对象,这样才能确保能让特定数字人能够出队,所以每次要是不出队,就需要把队首的元素重新入队到队尾,这样就相当于形成了环形结构。。所以如果报数题目中不是环形结构(或者间接环形)那么请不要使用队列,用最基本的数组就能实现。。。代码:m代表出队的数字,而 j 则是用原创 2021-04-29 15:14:14 · 214 阅读 · 0 评论 -
接雨水-官方题解分析(单调栈)
文章目录过程示意图:代码解读:过程示意图:代码解读:class Solution {public: int trap(vector<int>& height) { int ans = 0; stack<int> stk; int n = height.size(); for (int i = 0; i < n; ++i) { //栈中记录的是数组的索引,同转载 2021-04-25 23:58:16 · 239 阅读 · 0 评论 -
用C++求出组合个数and具体的组合数据
文章目录关于题目`可是有没有想过要是这样那如何得出组合的具体数据呢?`关于解题关于代码关于题目题目描述:取n个数组成为数组,从其中取m个数字组成一个组合,共有多少个这样的组合,并把具体的组合列举出来。看完题目很多人开始从公式着手得出组合数即CnmC_{n}^{m}Cnm得出结果,或者用Cnm=Cn−1m+Cn−1m−1C_{n}^{m}=C_{n-1}^{m}+C_{n-1}^{m-1}Cnm=Cn−1m+Cn−1m−1采用递归方法得出组合数。可是有没有想过要是这样那如何得出组合的原创 2021-04-04 18:51:25 · 707 阅读 · 0 评论 -
二维空间的dp详解(自顶向下and自底向上)
文章目录例题:自顶向下的好处自顶向下的函数结构详解:划重点:递归的结构:递归的原理:题目一(强烈建议用递归法):题目二(同样建议用递归法)例题:准备了两道做法几乎相同的二维空间的dp题目题目一:LeetCode-64最小路径和Leetcode64题目二:蓝桥杯-跳跃跳跃两者区别只在于子问题的个数,题目一的个数只有2个方向,而题目二有9个方向。自顶向下的好处有助于理解dfs、bfs等等算法。相比自底向上来说,前期虽然痛苦,但是当你清楚结果体系,熟悉后,你会发现写dp递归法比递推法原创 2021-03-26 22:19:33 · 1086 阅读 · 0 评论 -
N皇后问题(回溯法):看不懂你打我系列-LeetCode51
文章目录问题描述题目链接:问题解决初始化attack数组和queen数组设计dx、dy用于遍历八个方向的攻击范围(注意由于是扩散遍历所以应单独取值)写出put_queen函数(实现在位置(x,y)放置皇后,同时对attack数组更新)写出回溯算法的递归函数backtracksolveNQueens函数开发测试main函数问题描述题目链接:n皇后问题问题解决初始化attack数组和queen数组attack数组用于更新攻击范围,而queen用于更新皇后摆放位置。设计dx、dy用于遍历八个方向原创 2021-03-23 21:54:00 · 298 阅读 · 1 评论 -
dp-零钱兑换详解
文章目录题目链接:DP解题四步骤:步骤一:定义子问题步骤二:写出状态转移方程步骤三:确定dp数组的计算顺序C++代码:步骤四:空间优化题目链接:LeetCode322零钱兑换题目简介:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。DP解题四步骤:步骤一:定义子问题通过考虑特殊情况找出子问题:步骤二:写出状态转移方程如果amo原创 2021-03-12 20:42:09 · 510 阅读 · 0 评论 -
贪心算法-射击气球
文章目录什么是贪心算法Leetcode452-射击气球题目描述:解题框架:解题思路:最优情况的整体思路流程图:解题代码:解决问题的Solution类(注意sort函数的使用)main函数测试程序接口什么是贪心算法贪心算法不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优选择。使用贪心策略要注意局部最优与全局最优的关系,选择当前的局部最优并不一定能推导出问题的全局最优。贪心策略解题需要解决以下两个问题:1、该问题是否适合使用贪心策略求解,也就是该问题是否具有贪心选择性质 。2、制定贪心策略,以原创 2021-03-08 22:39:33 · 689 阅读 · 0 评论 -
用队列的思维判断出栈序列是否合法
文章目录LeetCode 946判断出栈序列是否合法解题框架题目分析代码实现解决问题的类:开发main函数测试程序接口:LeetCode 946判断出栈序列是否合法#mermaid-svg-530ziJJj1FSZtEVQ .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-530ziJJj1FSZtEVQ .l原创 2021-03-05 15:23:22 · 360 阅读 · 0 评论 -
已知两链表求交点的方法(Leetcode 160)
文章目录构造基本的解题框架:题目分析:贴出代码:一般解法:自己想set容器法:双指针法:计算链表长度的函数:调整头结点位置的函数:解决问题的类:最后写出输入输出的main函数测试接口:构造基本的解题框架:题目分析:1.通过嵌套两层循环进行从头到尾一一对比,此时时间复杂度为O(n^2).2.通过将其中一个链表的所有结点存放到STL中的集合中,set.insert()结点插入到其中, set.find(目标值)查找目标值是否在其中,若在其中则返回值不等于set.end(). 由于查找和添加到原创 2021-03-05 00:17:16 · 138 阅读 · 1 评论