
数据结构
文章平均质量分 86
KuoGavin
这个作者很懒,什么都没留下…
展开
-
链表的快速排序和归并排序
不同于数组快排和归并排序(见排序归纳总结(插入排序、归并排序、堆排序、快速排序、桶排序)),链表不能够随机访问,只能从链表头遍历至链表尾,针对这一特性,需要对数组的排序算法做相应的调整。文章目录1. 快速排序2. 归并排序1. 快速排序对于链表的快速排序,使用两个指针p和q,使得p和q都只向其next方向进行遍历,同时保证p之前的链表节点的val都小于head的val值,p和q之间的链表节点的val都大于head的val值,则当q遍历到链表末尾时,再将head的val和p的val值进行互换,则就进行原创 2021-07-26 10:09:38 · 2653 阅读 · 0 评论 -
LeetCode 82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]提示:链表中节点数目在范围 [0,300][0, 300][0,300]内−100<=Node.val<=100-1原创 2021-07-15 17:54:44 · 85 阅读 · 0 评论 -
Floyd算法:多源汇最短路
文章目录Floyd算法yxc的图最短路问题算法图镇楼:单源最短路所有边权为正:Dijkstra:正边权单源最短路算法;单源最短路存在负权边:Bellman_Ford和SPFA:带负边权的单源最短路算法;多源汇最短路:Floyd算法:多源汇最短路;Floyd算法Floyd 属于多源最短路径算法,能够求出任意2个顶点之间的最短路径,支持负权边。算法原理:(1) 从任意顶点 i 到任意顶点 j 的最短路径不外乎两种可能 ① 直接从 i 到 j; ② 从 i 经过若干个顶点到 j;原创 2021-07-06 19:40:14 · 684 阅读 · 2 评论 -
Bellman_Ford和SPFA:带负边权的单源最短路算法
文章目录Bellman_Ford算法SPFA算法yxc的图最短路问题算法图镇楼:Bellman_Ford算法初始化所有点到源点的距离为∞\infty∞,把源点到自己的距离设置为 000;不管三七二十一遍历 nnn 次;每次遍历 mmm 条边,用每一条边去更新各点到源点的距离;由以上的算法实现思路,可得出Bellman_Ford算法的时间复杂度为 O(mn)O(mn)O(mn);需要注意的点:需要把dist数组进行一个备份backup,这样防止每次更新的时候出现串联;由于存在负权边原创 2021-07-06 17:36:11 · 457 阅读 · 2 评论 -
图的遍历(DFS,BFS,Topology Sort)
文章目录1. 图的存储结构2. 图的遍历2.1 图的DFS遍历2.2 图的BFS遍历3. 图的拓扑排序1. 图的存储结构对于稠密图,使用邻接矩阵进行存储和表示。邻接矩阵即二维数组,数组中的每个元素分别表示一有向边的边权值,在实际使用时,我们在初始化时先按照字节设置为无穷大∞\infty∞,实际使用memset()函数字节填充0x3f,为何使用该值见:编程中将无穷大常量的设定为0x3f3f3f3f。常用模板为:#include <cstring> //为了使用memset()函数#原创 2021-07-06 10:36:04 · 321 阅读 · 0 评论 -
Dijkstra:正边权单源最短路算法
Dijkstra算法的原理见:有权图的单源最短路算法(Dijkstra算法)文章目录朴素Dijkstra算法的实现堆优化的Dijkstra算法的实现朴素Dijkstra算法的实现AcWing题目见:849. Dijkstra求最短路 I,该算法的时间复杂度为O(n)O(n)O(n),整个的大循环为nnn,同时每次循环当中:寻找剩下(未决)的图的点集中dist[i]dist[i]dist[i]的最小的点花费时间为nnn;将st[i]st[i]st[i]设置为true,即标记已经解决的时间为11原创 2021-07-06 00:06:39 · 416 阅读 · 1 评论 -
红黑树性质、插入节点和rb_tree容器
文章目录1. RB-tree 性质2. RB-tree 插入3. STL非公开rb_tree容器3.1 rb_tree 数据结构3.2 rb_node 设计实现3.3 __rb_tree_iterator 设计实现1. RB-tree 性质RB-tree(红黑树)是一种颇具历史并被广泛运用的平衡二叉树。相比于另一种平衡二叉树AVL-tree,其对平衡性规则的要求要宽松一些,且插入删除操作更便于控制,但是搜寻平均效率几乎相等。所谓RB-tree,不仅是一个二叉搜索树,而且必须满足以下规则:1. 每原创 2021-03-02 22:00:29 · 486 阅读 · 2 评论 -
O(1)空间复杂度遍历二叉树——Morris遍历
在之前学习的二叉树遍历(前文传送门)当中,其时间复杂度均为O(1)\mathcal{O}(1)O(1),而空间复杂度为O(n)\mathcal{O}(n)O(n),其或是利用递归调用栈或是数据结构中的栈结构来完成对树中节点的多次访问,也就是利用了辅助空间来实现二叉树的遍历。文章目录1. 实现思路2. 代码实现3. 分析推导3.1 Morris遍历的规律和与递归栈方式的对比3.2 Morris前序遍历3.3 Morris中序遍历3.4 Morris后序遍历1. 实现思路将当前所遍历到的节点记为cu原创 2021-01-29 00:30:50 · 766 阅读 · 0 评论 -
O(1)时间复杂度来获得队列或栈的最大值或者最小值
该类题型通常是让自己设计并封装应用程序接口(Application Programming Interface, API),即一些预先定义的函数,或指软件系统不同组成部分衔接的约定。 通常是使用常用的数据结构组合或是作为辅助空间来实现这些接口。具体选用何种数据结构来实现,一是依照题目中对时间或空间复杂度的要求,二是在平常的练习当中多加总结。 以下列出相关题目,题目中对时间复杂度的要求均为O(1)O(1)O(1),所以很容易想到用空间换取时间的思路。(一) 剑指 Offer 30. 包含min函原创 2021-01-22 16:16:23 · 3376 阅读 · 1 评论 -
最长不含重复字符的子字符串(滑动窗口/双指针,动态规划)
剑指 Offer 48. 最长不含重复字符的子字符串题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路: 长度为NNN的字符串共有(1+N)N2\frac{(1 + N)N}{2}2(1+N)N个子字符串(复杂度为 O(N2)O(N^2)O(N2) ),判断长度为NNN的字符串是否有重复字符的复杂度为O(N)O(N)O(N) ,因此本题使用暴力法解决的复杂度为O(N3)O(N^3)O(N3)。★1.滑动窗口/双指针解法 题目中要求答案必须是子串的长度,原创 2021-01-19 20:19:02 · 1780 阅读 · 0 评论 -
把数字翻译成字符串/斐波那契数列/青蛙跳台阶
今天做到剑指Offer中面试题46:把数字翻译成字符串,一看,这不是之前的斐波那契数列和青蛙跳台阶的翻版吗?遂记录一下解题思路。题目:给定一个数字,我们按照如下规则把它翻译为字符串:000翻译成aaa,111翻译成 bbb,……,111111翻译成 lll,……,252525翻译成zzz。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi",原创 2021-01-18 19:56:48 · 195 阅读 · 0 评论 -
LeetCode42.接雨水(暴力、DP、单调栈)
42. 接雨水题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1.输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 666个单位的雨水(蓝色部分表示雨水);示例 2.输入:heig原创 2021-01-04 16:05:05 · 202 阅读 · 1 评论 -
06-图3 六度空间 (30 point(s))
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。 “六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这...原创 2019-08-25 12:19:19 · 385 阅读 · 0 评论 -
04-树6 Complete Binary Search Tree (30 point(s))
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:The left subtree of a node contains only nodes with keys less than the node’s key.The right sub...原创 2019-08-26 10:09:36 · 139 阅读 · 0 评论 -
有权图的单源最短路算法(Dijkstra算法)
基本原理令S = { 源点s + 已经确定了最短路径的顶点 Vi };对任一未收录的顶点 V ,定义 dist[ t ] 为 S 到 V 的最短路径长度,但该路径仅经过 S 中的顶点。即路径 { S -> (Vi∈S) -> V }的最小长度;若路径是按照递增(非递减)顺序生成,则(限定了不能够解决有负边的情况)1)真正的最短路径必须只经过S中的顶点;2)每次从未收录的顶点...原创 2019-08-27 16:45:44 · 661 阅读 · 0 评论 -
07-图4 哈利·波特的考试 (25 point(s))
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有...原创 2019-08-28 11:18:37 · 183 阅读 · 0 评论 -
06-图1 列出连通集 (25 point(s))
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。输出格式:按照"{ v1 v2 … vk }"的格式,每行输出...原创 2019-08-25 11:56:47 · 187 阅读 · 0 评论 -
06-图2 Saving James Bond - Easy Version (25 point(s))
This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land ...原创 2019-08-24 11:33:45 · 231 阅读 · 0 评论 -
DFS和BFS之间的比较
一、深度优先搜索(dfs)的特点是:(1)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。(2)深度优先搜索方法有广义和狭义两种理解。广义的理解是,只要最新产生的结点(即深度最大的结点)先进行扩展的方法,就称为深度优先搜索...原创 2019-08-24 09:11:09 · 4456 阅读 · 0 评论 -
03-树2 List Leaves (25 point(s))
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a po...原创 2019-07-23 22:49:33 · 147 阅读 · 0 评论 -
02-线性结构4 Pop Sequence (25 point(s))
02-线性结构4 Pop Sequence (25 point(s))Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbe...原创 2019-07-19 11:15:41 · 227 阅读 · 0 评论 -
03-树3 Tree Traversals Again (25 point(s))
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stac...原创 2019-07-24 21:11:41 · 167 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学...转载 2019-07-30 15:07:35 · 174 阅读 · 0 评论 -
04-树7 二叉搜索树的操作集 (30 point(s))
题目本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST ...原创 2019-07-31 12:52:22 · 257 阅读 · 0 评论 -
04-树4 是否同一棵二叉搜索树 (25 point(s))
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的...原创 2019-07-31 20:40:41 · 194 阅读 · 0 评论 -
04-树5 Root of AVL Tree (25 point(s))
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is...原创 2019-07-31 21:38:33 · 179 阅读 · 0 评论 -
05-树7 堆中的路径 (25 point(s))
将一系列给定数字插入一个初始为空的小顶堆H[ ]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。输出格式:对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径...原创 2019-08-05 19:54:40 · 288 阅读 · 0 评论 -
03-树1 树的同构 (25 point(s))
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N...原创 2019-07-23 17:28:41 · 176 阅读 · 0 评论