![](https://img-blog.csdnimg.cn/20200131164538726.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
数据结构相关代码
AkagiSenpai
哼 ~ 哼 啊啊啊啊啊啊啊啊啊
▃▆█▇▄▖
▟◤▖ ◥█▎
◢◤ ▐ ▐▉
▗◤ ▂ ▗▖ ▕█▎
◤ ▗▅▖◥▄ ▀◣ █▊
▐ ▕▎◥▖◣◤ ◢██
█◣ ◥▅█▀ ▐██◤
▐█▙▂ ◢██◤
◥██◣ ◢▄◤
▀██▅▇▀
展开
-
简单并查集讲解(并+查)与代码实现
目录前言并查集定义与问题描述定义问题并查集实现集:father数组与最终父节点查:查找关系树并:合并两个集合并查集路径压缩模板前言这个玩意我很早以前就一直在用,可是一直没能写一篇总结性的博客,刚好最近算法实验要用到并查集,就补一下吧hdxm如果学习过【克鲁斯卡尔算法】求最小生成树,那么一定对并查集不陌生,因为克鲁斯卡尔教导我们要选取一条边,这个边的两个顶点不在同一个连通分量,而正是通过并查集这种数据结构,我们得以判断两个顶点是否在同一连通分量hxdm如果上过【数据结构】这门课,老师在讲【克鲁斯卡尔算原创 2020-05-30 01:06:23 · 749 阅读 · 0 评论 -
线段树 区间最值查询 / 区间更新 简单实现
线段树定义线段 = 一维数组如图:按照下标,二分的将一个一维数组,分为两半,每个线段树节点都代表着原数组中的一段子区间,而叶子节点则代表着长度为1的区间线段树可以用来干什么主要是解决区间问题,比如查询一个区间的最值,给一个区间所有元素加减一个数,或者是求取某个区间的和,对于静态的区间,我们都有比较好的方法,比如【前缀和与差分数组】,【ST做RMQ静态查询】可是这些方法都有缺点:如果我们...原创 2020-03-30 00:56:28 · 639 阅读 · 0 评论 -
C++ 自定义哈希函数使得自制数据类型也可使用STL的哈希set,map
如果想用哈希的时候,但是哈希的目标又不再STL标准的类型内,比如一个自定义的class,就不太方便使用STL默认的哈希函数,比较函数,那么就需要重写了什么是哈希哈希就是搞一大块内存,然后给他们编号,然后通过一定的手段,对每个要存储的对象,尽量通过哈希函数得到不同的值,根据这个值放到对应的内存中冲突假设使用的哈希函数是 %4 ,要存储的数据类型是int,存储 16 和 64 这两个数字的时候...原创 2020-03-21 16:53:50 · 3754 阅读 · 0 评论 -
LeetCode:496/503 下一个更大元素 I / II 单调栈及单调栈性质总结
关于单调栈的其他题目:单调栈的用处是快速找到左右边第一个小于/大于栈顶元素的元素【LeetCode:402 移掉k位数字】【LeetCode:84. 柱状图中最大的矩形】下一个更大元素 I给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大...原创 2020-03-17 17:57:32 · 168 阅读 · 0 评论 -
LeetCode:84. 柱状图中最大的矩形 暴力/分治/单调栈解法
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10来源:力扣(LeetCode)链接:ht...原创 2020-03-17 15:45:35 · 413 阅读 · 0 评论 -
LeetCode:面试题08.06汉诺塔 用栈模拟递归过程的一些总结
如果有的题目要求不能用递归,必须借助栈来完成,那么情况就会稍显复杂如果递归是返回一个值,那么我们可以通过动态规划来求解,如果是递归进行一些操作,比如汉诺塔,那么我们只能用栈模拟这个过程比如题目【面试题 08.06. 汉诺塔问题】在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大...原创 2020-03-16 13:37:39 · 279 阅读 · 0 评论 -
UVA806 空间结构 Spatial Structures 搜索
题目传送门题意翻译一个四分树是由一个方格的结构组成的,如图:(就是上面的三个图)。那些像素点可以构成一个四分树,如图:(就是上面的那个树)。我们规定,NW=1,NE=2,SW=3,SE=4,而一个节点所构成的数字串可以认为是一个五进制数,将它们排序后输出。例如:上图中地四号节点的路径为NE,SW,所以是32(5进制) = 17(十进制)那么上树所对应的一传数列为:(在十进制下)9 ...原创 2020-03-15 17:37:41 · 259 阅读 · 0 评论 -
最__容器 (最大队列,最小栈)模板
有时候题目给的输入满足某些容器的特性,比如滑动窗口=队列,FIFO=栈,那么要求最值,同时还要实现正常容器的 pop , top 操作,那么可以考虑这个模板其实关键就是:使用一个正常容器和一个辅助容器,两个容器的插入删除端必须一致(比如都是push_back(), pop_front())读取数据,正常容器正常插入,删除辅助容器则要维护:1.维护在读取端必须是最值2.在插入...原创 2020-03-07 17:45:51 · 169 阅读 · 0 评论 -
字典树简单实现 插入 查找 遍历
字典树是一种存储字符串的高效的结构,它保存了不同字符的相同前缀,又因此叫做前缀树,使用前缀,大大避免相同字符的重复匹配,加快查找效率字典树是一颗多叉树,比如存储26个字母的,那么就有26叉字典树的节点不存储字符,而是用树的边来存储字符字典树的每一个节点都对应着一个字符子串字典树的叶子节点对应的字符串是创建字典树的字符串集合里的元素如图:使用 5 个字符串创建字典树,蓝色节点代表子串,...原创 2020-03-07 16:16:42 · 2231 阅读 · 1 评论 -
LeetCode:面试题59 队列的最大值
面试题59 - II. 队列的最大值请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop...原创 2020-03-07 14:03:32 · 126 阅读 · 0 评论 -
LeetCode:124 二叉树中最大路径和
题目描述给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:示例 2:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum著作权归领扣网络所有。商业转载请联系官方授权,非...原创 2020-03-02 18:46:57 · 199 阅读 · 0 评论 -
LeetCode:295 数据流的中位数 双堆法
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)...原创 2020-03-02 13:54:43 · 530 阅读 · 0 评论 -
LeetCode:215 数组中第k个最大元素 优先队列 / 堆
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:...原创 2020-03-02 09:54:46 · 275 阅读 · 0 评论 -
LeetCode:2 两数相加,链表递归
题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -...原创 2020-02-24 14:52:14 · 341 阅读 · 0 评论 -
LeetCode:28 实现strStr() kmp实现
题目描述实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle =...原创 2020-02-24 14:14:36 · 133 阅读 · 0 评论 -
LeetCode:1 两数之和 哈希表巧妙使用
题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣...原创 2020-02-23 14:39:59 · 168 阅读 · 0 评论 -
LeetCode:169 多数元素 分治法/哈希表/排序
题目描述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maj...原创 2020-02-22 16:47:29 · 1024 阅读 · 3 评论 -
C++ STL merge/inplace_merge 归并函数简单使用
C++ STL merge/inplace_merge 归并函数简单使用c++自带的归并函数也是比较好用的,可以节省很多时间,归并也分为异地归并和原地归并,先来看一下异地归并异地归并异地归并需要一个额外的空间来存储归并后的结果,通常是通过传递该空间的起始迭代器(最底层迭代器)来实现的/*function : 将两个有序序列按照运算符归并为一个有序序列param beign1 ...原创 2020-02-21 17:52:42 · 1973 阅读 · 0 评论 -
常用的二分搜索模板及lower/upper_bound实现
常用的二分搜索模板及lower/upper_bound实现【关于lower/upper_bound库函数】约定待查找数组nums是有序或者部分有序数组按照升序排序待查找区间是 [l, r],区间中点值 mid=l+(r-l)/2类型1:收缩区间不根据左右邻居这是一种常见的查找方式,通过比较中点下标mid元素与目标元素的大小关系,来决定收缩左边界还是右边界查找条件可以在不与元素的两...原创 2020-02-21 00:34:57 · 254 阅读 · 0 评论 -
LeetCode:127 单词接龙 哈希set+BFS 与双端BFS优化
LeetCode:127 单词接龙 哈希set+BFS 与双端BFS优化【附:图BFS的做法,时间复杂度高】题目描述给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有...原创 2020-02-16 20:09:47 · 244 阅读 · 0 评论 -
LeetCode:127 单词接龙 无向图BFS
LeetCode:127 单词接龙 无向图BFS给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词...原创 2020-02-16 17:38:48 · 129 阅读 · 0 评论 -
LeetCode:349 两个数组交集 set简单运用
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。来源:力扣(LeetCode)链接:https://lee...原创 2020-02-16 15:13:00 · 121 阅读 · 0 评论 -
C++ STL set集合容器简单使用
C++ STL set集合容器简单使用简介set事一种关联式容器,刻画了具有某些相同特征的事物的集合,类似数学概念 ,与【STL的map】相似,但是不同的是,set的键是元素本身通过查询,可以快速确定一个元素是否位于某个集合之中常用方法set的创建与初始化可以单纯的像int a一样声明一个setset<int> se;也可以由两个迭代器确定的一段序列来初始化集合,即把...原创 2020-02-16 15:07:37 · 248 阅读 · 0 评论 -
LeetCode:234 回文链表 时间O(n) 空间O(1)
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-linked-list著作权归...原创 2020-02-15 16:25:02 · 127 阅读 · 0 评论 -
LeetCode:350 两个数组的交集II map映射
LeetCode:350 两个数组的交集II map映射给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。...原创 2020-02-15 15:16:13 · 204 阅读 · 0 评论 -
KMP算法求next,用动态规划思想去理解
KMP算法求next,用动态规划思想去理解kmp的next简介因为想要减少不必要的匹配,比如如果一个字符串是s1:abdabas2:aba可以看到下标为2的地方失配,因为串具有头尾对称性,即具有相同真前后缀,直接把s2的串头那部分相等的拽过来,再匹配,就不用一步一步挪动了,可以跳步next数组保存的,其实是【最长相同真前后缀】的长度next[i]表示:主串下标 [0, i-1] ...原创 2020-02-09 19:09:30 · 928 阅读 · 0 评论 -
链表有环相及其关问题解法
链表有环相及其关问题解法经典老番 题目:链表上的环如何判断,找出环入口,环长度,环上节点。。。。结构定义与环的创建typedef struct node{ int data; node* next; node(int dt):data(dt), next(NULL){}}node;node n1 = node(1);node n2 = node(2);node n3 = n...原创 2020-02-09 15:10:54 · 108 阅读 · 0 评论 -
C++ STL堆相关函数的简单使用
C++ STL堆相关函数的简单使用简单介绍下堆相关的函数的使用堆不是容器,而是组织容器元素的一种特别方式。只能确定堆的范围,即开始和结束迭代器指定的范围。这意味着可以用容器中的元素子序列创建堆,可以在已生成的堆中添加元素。以vector容器为例:为了简化代码,vector的读取和输出被打包为两个函数 ↓vector<int> get_input(){ int n;...原创 2020-02-07 17:26:41 · 1135 阅读 · 1 评论 -
LeetCode:95 不同的搜索二叉树 递归解法
LeetCode:95 不同的搜索二叉树 递归解法来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路因为是从1~n所有数字组成的二叉搜索树,我们自然想到,树的根有1,2,…n 种选择选择根x的话,...原创 2020-02-04 17:52:31 · 438 阅读 · 0 评论 -
LeetCode21:合并两个有序链表 迭代解法
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路:设置一个虚拟的头指针head和一个迭代用的pre指针,pre永远指向新链表的最后一个节点通过不断向后迭代l1,l2,并且比较l1, l2的值的大小,决定...原创 2020-02-04 16:03:43 · 206 阅读 · 0 评论 -
LeetCode:21 合并两个有序链表 递归解法
LeetCode:21 合并两个有序链表 递归解法很容易想到【归并排序】归并排序也是合并两个有序的序列,不过一般是用迭代法,这里合并链表,使用递归:一趟递归分析假设有有序序列[1, 2, 3]和[2, 3, 4, 5],归并的开始,指针指向两个链表的头,即1, 2比较指针位置的元素大小,显然1<2,1排在2前面问题转换为:合并有序序列[2, 3]和[2, 3, 4, 5]令1...原创 2020-02-04 15:28:16 · 394 阅读 · 0 评论 -
LeetCode:990 等号方程的可满足性 并查集解法
LeetCode:990 等号方程的可满足性 并查集解法【传送门】给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。示例...原创 2020-01-31 17:51:45 · 180 阅读 · 0 评论 -
LeetCode:199 二叉树右视图 层次遍历解法
LeetCode:199 二叉树右视图 层次遍历解法【传送门】题目描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-ri...原创 2020-01-31 16:59:18 · 167 阅读 · 0 评论 -
简单的前缀表达式计算
简单的前缀表达式计算简单是指表达式简单,所有数字均为 0~9 之间,不是代码简单【关于二叉树的递归创建与非递归遍历】【其他:中缀表达式转后缀表达式】【其他:后缀表达式计算】思路因为给定的是前缀表达式,那么方便我们直接递归地建一颗表达式树,并且递归地计算递归创建步骤:读取字符如果字符是数字,那么说明是叶子节点,直接将当前节点赋值为数字如果字符是符号,说明是某个根节点,不仅需要...原创 2020-01-31 15:21:36 · 1141 阅读 · 0 评论 -
LeetCode:47 全排列II dfs+剪枝解法
LeetCode:47 全排列II dfs+剪枝解法【题目传送门】题目描述给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations-ii著作权归领扣网络所有。商业转...原创 2020-01-27 17:16:26 · 337 阅读 · 0 评论 -
简单的中缀表达式转后缀表达式
简单的中缀表达式转后缀表达式这里的简单指的是表达式简单,所有数字都是个位数,不是代码简单中缀表达式就是我们平时最经常使用的,例:(1+2)*3-4后缀表达式就是把运算符放到运算数后面【后缀表达式传送门】【后缀表达式计算传送门】转换思路假设输入的中缀表达式的字符串为 str需要一个栈 s 来作为临时的先进后出的存储结构需要一个字符串 result 来保存最终的结果从左到右遍历中...原创 2020-01-27 00:01:25 · 209 阅读 · 0 评论 -
简单的后缀表达式计算
简单的后缀表达式计算(简单不是指代码简单,而是要计算的表达式简单)什么是后缀表达式?百度百科传送门最简单后缀表达式:a b +一眼可以看出结果是 a + b,就是先将前面的数字存起来,遇到运算符,取两个数字,运算,再存起来使用具有先进后出 好特性 的栈结构去存储运算数具体做法:从左往右遍历表达式如果是运算数,进栈如果是运算符,在栈中取两个数字做运算(注意顺序是 ...原创 2020-01-26 20:49:35 · 511 阅读 · 0 评论 -
蓝桥杯:完全二叉树的权值(层次遍历求最大和是那一层)
蓝桥杯:完全二叉树的权值(层次遍历求最大和是那一层)问题描述给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示:现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是 1。【输入格式】第一行包含一个整...原创 2020-01-24 18:15:18 · 1037 阅读 · 0 评论 -
C++ STL 优先队列(priority_queue)容器的简单使用
C++ STL 优先队列(priority_queue)容器的简单使用如果需要用到堆的地方,可以使用C++ STL中的priority_queue实现,比较方便/*priority_queue <type, containor, function>param type : 每个元素的数据类型param containor : 底层用什么结构存储数据,默认是vector...原创 2020-01-20 17:54:41 · 460 阅读 · 0 评论 -
链表翻转 递归与非递归写法
链表翻转 递归与非递归写法链表类实现:class node{public: node(); int data; node* next; void insert(int dt); void display(); };node::node(){ this->next = NULL;}void node::insert(int dt){ node* nd ...原创 2020-01-13 15:18:03 · 200 阅读 · 0 评论