
数据结构与算法
文章平均质量分 77
个人随笔
消逝者
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java Scanner输入和常用API
Java 和 C++ 常用 API 介绍原创 2022-04-10 22:22:32 · 1305 阅读 · 0 评论 -
C++处理输入和STL API介绍
本文总结了C++编程中常见STL API的使用方法和ACM的输入输出,原创 2025-06-23 22:10:28 · 930 阅读 · 0 评论 -
二分查找树的实现(Java)
Java 实现二分查找树原创 2022-07-25 22:42:39 · 423 阅读 · 0 评论 -
堆(优先级队列)的实现(Java)
Java 实现 堆原创 2022-07-25 20:05:49 · 591 阅读 · 2 评论 -
LeetCode算法题7.2:动态规划2,求上升子序列的数目
求序列中的上升子序列数目原创 2022-04-21 16:56:36 · 926 阅读 · 0 评论 -
LeetCode算法题7.1:动态规划1,0-1背包
0-1背包:用回溯法来解决。用动态规划来解决a,0-1背包解决思路问题分析状态描述状态转移a,推导-背包大小代码b,推导-物品次序代码c,物品次序从1开始代码原创 2022-04-20 15:34:56 · 839 阅读 · 0 评论 -
LeetCode算法题7:动态规划0-引入
动态规划引入: 斐波那契数列、凑零钱问题、采用DP来求最短路径和求最长上升子序列(LIS)原创 2022-04-17 20:33:09 · 965 阅读 · 0 评论 -
LeetCode算法题6:贪心 - 跳跃游戏
一、跳跃游戏二、跳跃游戏II原创 2022-04-12 20:00:20 · 3809 阅读 · 3 评论 -
LeetCode算法题6:递归和回溯2
递归和回溯续,有七道回溯相关的算法题:全排列|| 、组合总和、组合总和||、子集、子集||、第 k 个排列、复原IP地址。原创 2022-04-07 14:16:19 · 1491 阅读 · 1 评论 -
LeetCode算法题5.1:DFS/BFS - 单词搜索
单词搜索*原创 2022-04-04 19:51:14 · 364 阅读 · 0 评论 -
LeetCode算法题4.2:递归和回溯-字符串中的回溯问题
一、电话号码的字母组合二、括号生成总结关于回溯和递归括号生成的递归描述 :电话号码的字母组合的递归描述 :括号生成的BFS描述 :原创 2022-03-31 22:09:04 · 663 阅读 · 0 评论 -
LeetCode算法题4.1:递归和回溯-解数独
使用回溯来解数独游戏原创 2022-03-30 22:04:40 · 494 阅读 · 0 评论 -
LeetCode算法题5:DFS/BFS-扫雷游戏
扫雷游戏和被围绕的区域(不太简单的DFS/BFS,当前元素的状态要依赖于下一次遍历的元素状态)原创 2022-03-30 16:51:12 · 3777 阅读 · 0 评论 -
LeetCode算法题4:递归和回溯-N皇后问题
递归和回溯-N皇后问题原创 2022-03-26 16:01:14 · 1723 阅读 · 0 评论 -
Java 字节数组(byte[])和整型(int)的相互转换
Java 字节数组(byte[])和整型(int)的相互转换原创 2022-03-08 18:45:45 · 28281 阅读 · 3 评论 -
二叉查找树的实现
二叉查找树(查找,删除,插入,打印)原创 2021-12-13 21:47:20 · 483 阅读 · 0 评论 -
ArrayList 和 LinkedList 的自定义实现
ArrayList->SimpleArrayListLinkedList->SimpleLinkedList原创 2021-11-30 21:51:51 · 687 阅读 · 0 评论 -
Java 集合中的方法性能分析
Collection 中 get() 和 remove()方法的效率原创 2021-11-28 22:50:48 · 432 阅读 · 0 评论 -
算法杂项~
一、O(logn)算法1.1、折半/二分查找(binary search)1.2、求最大公因数1.3、幂运算原创 2021-11-28 21:56:39 · 232 阅读 · 0 评论 -
LeetCode算法题3:求最大子序列和
本文简单介绍递归的使用(依次打印出一个 int 整数的每一位)和四种求最大子序列的方法(以 int 数组为例)。原创 2021-11-28 20:22:18 · 748 阅读 · 0 评论 -
LeetCode算法题2:求字符串b在字符串a中的起始下标
算法题2:求字符串b在字符串a中的起始下标原创 2021-11-08 19:56:23 · 4514 阅读 · 0 评论 -
LeetCode算法题1:判断整数数组是否存在重复元素
算法题1:判断整数数组是否存在重复元素原创 2021-11-08 16:50:17 · 4637 阅读 · 0 评论 -
LeetCode算法题0:贪心 - 分发糖果
LeetCode 贪心算法- 分发糖果这是一种思路清奇的解法,它的时间复杂度和空间复杂度都是极好的,可参考代码提交结果。(beats 99.36% 见文末附图)原创 2021-04-24 21:43:10 · 701 阅读 · 0 评论 -
哈希表(散列查找)(c/c++)
通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置。一般来讲,为了进行高效率的查找,要求哈希函数简单均匀、空间利用率高、关键字之间的冲突少。关于散列查找的实现需要着重考虑两个问题:1,散列函数的设计 2,解决冲突问题函数构造方法常用的方法有:1,直接定址法:H(key)=axkey+b,特点:简单、无冲突,但造成存储空间浪费2,数字分析法 3,平方取...原创 2020-02-15 14:11:53 · 1579 阅读 · 0 评论 -
二叉排序树(c/c++)
二叉排序树又称为二叉查找树,对树中任意一个结点来说,如果它的左子树不为空,那么左子树中的数一定小于该结点中的数,同理,非空右子树中的数一定大于该结点中的数。(也可以设置为左大右小)查找在二叉排序树中查找一个数的算法如下:bTree* searchT(bTree* T, int key){ if (T == NULL) return NULL; if (T->data == k......原创 2020-02-15 12:41:24 · 722 阅读 · 0 评论 -
顺序查找(c/c++)
顺序查找顺序查找分为对无序表和有序表的查找:对无序表的查找算法如下:int search(int* array, int num,int key)//数组下标从0开始{ int i=num; while (i >= 0 && array[i] != key) --i; return i; //i为-1时出错}int search(int* array, ...原创 2020-02-15 11:08:43 · 1588 阅读 · 0 评论 -
最短路径(Floyd算法)(c/c++)
如果要得到图中各个顶点之间的最短路径,方法1:可以对每一个顶点采用Dijkstra算法;方法2:可以采用Floyd算法,它是一种用来求双源点之间最短路径的算法,采用邻接矩阵来存储图辅助结构int D[maxSize][maxSize];//表示从各个顶点之间最短路径长度例:D[i][j]:表示从i顶点到j顶点的最短路径长度bool p[maxSize][maxSize][maxSize]...原创 2020-02-13 16:21:13 · 1556 阅读 · 0 评论 -
最短路径(Dijkstra算法)(c/c++)
Dijkstra是一种求单源点最短路径的算法,即求某一个顶点到其余各顶点之间的最短路径,下面采用邻接矩阵来存储图中信息算法思路为:1,假设v0是源点,s是已求得最短路径的终点集合,用D[i]来保存从v0到vi顶点之间的最短路径。初始:将v0置于集合s之中,2,初始化D[i]为v0到vi之间的权值。a,求从v0出发长度最短的路径,通过计算D[j]=min{D[i]|vi不属于s},找到j顶点,......原创 2020-02-13 12:08:15 · 5851 阅读 · 0 评论 -
AOE网(求关键路径)(c/c++)
工程中想要知道完成工程至少需要多少时间以及影响工程进度的关键子工程,通过AOE网来解决。其中边表示活动,顶点表示事件。如下图:其中入度为0的点v0称为源点,出度为0的点v5称为汇点。当v1事件发生时,a0活动已经结束,当v0事件发生时,a0活动可以开始。事件:任何一个顶点事件,都存在最早开始时间与不影响整个工期的最晚开始时间,最早开始时间用ve[i[来表示,最晚开始时间用vl[i]来表示...原创 2020-02-12 19:44:11 · 2258 阅读 · 2 评论 -
AOV网拓扑排序(c/c++)
拓扑排序工程是否顺序进行,流程是否合理,采用AOV网来表示,顶点用来表示工程(活动),弧表示工程间的顺序关系。如a有一个指向b的弧,意味着a结束了b才能开始(a为弧尾,b为弧头)算法思路:1,在有向图中找到无前驱(入度为0)的结点V,输出。2,删除V及以V为弧尾的弧。3,重复1,2,输出全部结点/或者网中没有无前驱的点(没有入度为0的点,即存在环)拓扑排序采用邻接表较方便实现,下面给出以邻接...原创 2020-02-12 19:22:42 · 952 阅读 · 0 评论 -
最小代价生成树Prim/Kruskal(c/c++)
常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用,Prim算法在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选),找与u集合中所有点连接的权值最小的边(此时只有a结点),假设该边连接a和b结点,b结点被选定放入u集合,查找与u集合中所有点连接的权值最小的边(此时有a,b结点),通过改变找到c结点,c被选定放入u集.........原创 2020-02-12 13:21:53 · 2411 阅读 · 2 评论 -
DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
深度优先搜索算法(DFS)深度优先搜索算法思路:(有点贪心算法的意思)1,从某个给定结点a出发,访问它2,查找关于a的邻接点,查找到a的第一个邻接点b之后,对b结点进行DFS搜索,也就是对b结点执行步骤2…当某个结点的所有邻接点都被访问过之后,回退上一层DFS算法中继续运行3,程序执行完毕下面给出了在邻接矩阵存储情况下的深度优先算法,每个被访问过的结点用visited数组标记:void...原创 2020-02-11 22:13:01 · 1098 阅读 · 0 评论 -
图(c/c++)
简介图是由顶点和边组成的一种数据结构。n表示顶点数,e表示边的个数。a,图按照边有没有方向可分为有向图和无向图两种b,完全图:每对不同的顶点之间都恰连有一条边相连。n个顶点的有向完全图的边的个数为nx(n-1),无向完全图的边的个数为(nx(n-1))/2。图按照边的数目多少可以分为稀疏图和稠密图c,顶点的度:图中某个顶点的度为该顶点所连接的边的个数。有向图中顶点的度按照指向该结点和由该结...原创 2020-02-11 15:36:00 · 420 阅读 · 0 评论 -
哈夫曼树(最优二叉树)(c/c++)
哈夫曼编码halfman! halfman! 半人万岁!(权力的游戏)huffman coding哈夫曼编码的核心是构造哈夫曼树─即最优二叉树,带权路径长度最小的二叉树。它会使出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,可用于数据的无损耗压缩。哈夫曼树引入如果对多个字符进行哈夫曼编码,如 a(7),b(5),c(2),d(4...原创 2020-02-10 21:45:10 · 2388 阅读 · 4 评论 -
线索二叉树(c/c++)
线索二叉树定义:对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。特点:利用线索二叉树进行遍历时,不必采用堆栈处理,可看做是对线性结构进行访问,速度比一般二叉树的遍历速度快,且节约存储空间。并且任意一个结点都能直接找到它的前驱和后继结点。 但是结点的插入和删除麻烦,...原创 2020-02-10 12:33:23 · 435 阅读 · 0 评论 -
二叉树的非递归遍历(c/c++)
二叉树的非递归遍历分为三种:先序非递归遍历,中序非递归遍历和后续非递归遍历。这和递归遍历的结果是一样的,区别只是在于采用了循环结构。先序非递归遍历采用辅助数据结构栈来实现,先序遍历是按照先根,后左子树,再右子树的顺序进行递归访问的。由于栈是先入后出的,所以入栈顺序为先右孩子后左孩子。非递归的算法是先将根结点入栈,栈不为空时:根结点出栈并访问,然后将右孩子入栈,再将左孩子入栈;左孩子出栈并访问...原创 2020-02-09 21:11:22 · 2372 阅读 · 0 评论 -
二叉树的递归遍历和层序遍历(c/c++)
递归遍历:二叉树的三种递归遍历为先序遍历,中序遍历和后续遍历。它们相似之处在于都是对二叉树的递归遍历且对任何一个结点都经过三次,区别在于哪一次对该结点进行访问,由此分为先,中,后序遍历。所以对于任一结点都有:三次经过,一次访问。先序遍历:仅以先序遍历为例,其思路是,当我们对二叉树进行遍历时,先对该结点内的数据进行访问,然后依次遍历它的左右孩子结点,递归进行直至结束。例:对一个有三个结...原创 2020-02-08 16:39:20 · 3371 阅读 · 0 评论 -
树与二叉树(c/c++)
树的特点:结点的度:该结点拥有非空子树的个数。树的度:所有结点的度的最大值。层次:第一层为树的根结点所在层,第二层为根的儿子所在层...。树的高度(深度):树的最大层次。结点的高度:从最深的叶子结点往上数起。结点的深度:从根结点数起二叉树:二叉树是递归定义的,其结点有左右孩子之分。二叉树有顺序存储和链式存储两种存储结构,其中链式存储最为常用,顺序存储结构适合用于完全二叉树的存储,将结点...原创 2020-02-07 12:16:52 · 368 阅读 · 0 评论 -
排序总结
最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 直接插入 o(n) o() o() o(1) 是 冒泡 o(n) o() o() o(1) 是 简单选择 o() o() o() o(1) 否 希尔排序 不定(但不是o(nlogn))...原创 2020-02-06 14:39:54 · 237 阅读 · 0 评论 -
基数排序(c/c++)
基数排序不同前面的各种排序,它并不基于比较排序,而是采用多关键字排序。通常,按照低位至高位的顺序进行排序的,也就是最低位优先(LSD)。本文也是采用最低位优先排序,代码是对简单的两位数进行基数排序,所采用的存储结构为二维数组,仅为说明基数排序的思想。在此基础上便可以进行多位数的排序,也可以采用链表进行存储,都是可以的。计数排序过程可粗略的看为 分配-收集,分配-收集,.....,以最低位优...原创 2020-02-06 12:50:23 · 778 阅读 · 0 评论