数据结构
数据结构知识点概述及代码实现
algsup
这个作者很懒,什么都没留下…
展开
-
C++:一些刷题技巧汇总
前言:主要记录刷题过程中遇到一些技巧,供自己需要时进行查阅。1)保证 x-t、x+t 在 int 范围内:// 防止 x 过小,x-t 小于 INT_MIN,这样会溢出。// 若 x>=INT_MIN+t,则 x-t>=INT_MIN,不会溢出;若 x<INT_MIN+t,取max的话,最后值为INT_MIN+t-t=INT_MIN不会溢出max(x,INT_MIN+t)-t;// 防止 x 过大,x+t 大于 INT_MAX,这样会溢出。// 若 x<=INT_M原创 2022-01-20 11:05:17 · 621 阅读 · 0 评论 -
算法面试中时间限制与时间复杂度之间的关系
前言:本人刚考完研究生初试,先准备算法刷题中,记录一些自己认为重要的点。时间限制与时间复杂度之间的关系:一般题目会限制时间为1s,在1s内计算机最多进行5*10^8次运算。由于时间复杂度N的前面还会存在常数,因此以下的最大数据规模除以10或除以2都是很保险的,不会发生超时现象。O(N)数据规模最多为10^8O(N*logN)数据规模最多为10^7O(N^sqrt(N))数据规模最多为10^6O(N^2)数据规模最多为10^4O(N^3)数据规原创 2021-01-02 19:07:58 · 1576 阅读 · 0 评论 -
图论之最短路径(Bellman-Ford算法、Dijkstra算法、SPFA算法、Floyd-Warshall算法实现)
前言:前几天考研复习了图论算法,现在抽点时间,写下博客记录下。最短路径的定义:给定图G(V,E),求一条从起点到终点的路径,使得这条路径上经过的所有边的边权之和最小。常用的最短路算法有:Bellman-Ford算法、Dijkstra算法、SPFA算法...原创 2020-02-20 21:19:06 · 1241 阅读 · 0 评论 -
图论之拓扑排序
前言:前几天考研复习了图论算法,现在抽点时间,写下博客记录下。拓扑排序的定义:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列...原创 2020-02-20 17:00:01 · 482 阅读 · 0 评论 -
[摩尔投票法万能模板]leetcode229:求众数 Ⅱ (medium)
题目:题解:摩尔投票法:由于众数的次数超过n/3,所以数组最多有两个众数(两个众数的次数大于2n/3)代码如下:class Solution {public: //题解1:暴力法 vector<int> majorityElement_1(vector<int>& nums) { map<int,int>...原创 2020-01-08 20:48:07 · 359 阅读 · 0 评论 -
leetcode刷题总结之链表
前言:今年过年前的任务就是回顾之前的刷过题,然后弄清以前没有弄懂的知识点,最后归纳整理形成自己的体系。因为“学而不思则罔,思而不学则殆”,在比赛或者面试做题时,只有三种情况,会让你不能ak所有题目,这三种情况分别是:sb失误、不会做、状态不佳。然而写总结所要做的是就是将之前的sb失误减小为0,之前不会做的题做熟做透,摸清套路,至于状态嘛,睡好觉兴奋点就是发挥出真正水平呀。文章目录1、链表2、...原创 2020-01-18 23:10:05 · 9145 阅读 · 10 评论 -
leetcode刷题总结之二叉搜索树
前言:终于放寒假了,在家休息几天然后查了下考研学校后,打算开始写总结了。原因很简单,刷过的好多题都忘了,打算二刷顺便写下总结。引用名言:“学而不思则罔,思而不学则殆。”所以在做题的同时,我们需要更多的思考,这样才能把知识完全学懂,今日总结的主题是《二叉搜索树》。二叉搜索树的定义及性质:二叉搜索树(英语:Binary Search Tree),也称为二叉查找树、有序二叉树(ordered b...原创 2020-01-13 22:20:25 · 1008 阅读 · 0 评论 -
C++:前缀和子矩阵的模板
前缀和子矩阵模板:解释:矩阵a的第一行第一列全部铺0,是用来更好的帮助建立前缀和子矩阵s的。前缀和子矩阵s的建立:s[i][j] = s[i-1][j] + s[i][j-1] -s[i-1][j-1] + a[i][j];。解释:以点[i,j]作为作为最右下角的最大矩阵的前缀和需要加上点[i-1,j]和点[i,j-1]的前缀和,然而会重复多加一个点[i-1][j-1]的前缀和,所以要减一...原创 2019-12-15 17:53:23 · 600 阅读 · 0 评论 -
C++:树状数组模板
前言:昨日学习了一波树状数组,学习好了算法步骤和原理后,自己写了C++的板子,大家可复制粘贴使用即可。树状数组:是一种用于高效处理对一个存储数字的列表进行更新及求前缀和的数据结构。关于树状数组的算法步骤:树状数组(Binary Indexed Tree),看这一篇就够了,大家看这篇就好了。树状数组模板:#include <iostream>#include <vect...原创 2019-11-30 10:24:40 · 711 阅读 · 0 评论 -
leetcode刷题总结之回溯法
前言:好久没写总结了,总感觉心里空空的。回溯法是看labuladong的详解回溯法入的门,然后看了《计算机算法设计与分析》第5章的回溯法部分弄清了原理,今日总结一下,供以后复习用。回溯法的定义:回溯法有通用解法的美称,对于很多问题,如迷宫等都有很好的效果。回溯法实际就是对问题的解空间树采用深度优先搜索的方式,搜索需要解决问题的任一解或者所有解,它是一个既带系统性又带跳跃性的搜索算法。回...原创 2019-11-27 22:02:44 · 3436 阅读 · 0 评论 -
leetcode刷题总结之滑动窗口
前言:这段时间课比较多,每天还要准备6级,所以题刷的有点慢。leetcode关于滑动窗口的题有20道,其中只有14道免费题,所以我就做了免费题啦。然后总结一下套路,以后复习用。滑动窗口思想:1)2)3)...原创 2019-10-31 16:47:25 · 6497 阅读 · 1 评论 -
马拉车算法(不懂问我)
前言:刚刚参考大佬的题解做完了leetcode336:回文对,然后明白题解使用的是前缀树+马拉车。啊?马拉车是啥?我不知道,那我当然要学学啊。马拉车的解决的问题:给定字符串S,求S中的最长回文子串?回文串:就是字符串的前后两个子字符串关于最中间对称(长度为奇数的字符串就是关于最中间的字符对称;长度为偶数的字符串就是整个前半段字符串和整个后半段字符串对称)https://www.cnblo...原创 2019-10-28 23:33:15 · 6917 阅读 · 9 评论 -
leetcode刷题总结之前缀树
前言:由于这段时间在学校上课了,刷题也只有每天晚上刷两道题了,不能像暑假那样刷题一肝到底了。前缀树是上个星期开始刷的,leetcode总共有17个前缀树的题目(其中包括3个收费题,所以我把14个免费题做完了),今天总结下,以后复习用。前缀树的定义:前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。前缀树具体定义...原创 2019-09-21 17:03:16 · 5988 阅读 · 4 评论 -
leetcode刷题总结之二分法模板
模板1:原创 2019-09-03 17:07:47 · 877 阅读 · 0 评论 -
leetcode刷题技巧之双指针技巧
在刷题的时候,我们会使用双指针可以很快的解题,下面有两种情景运用双指针会很方便:1)两端向中间迭代数组,这时可使用的双指针技巧为:一个指针从始端开始,一个指针从终端开始。注:这种技巧在排序数组中经常使用。练习题如下:反转字符串数组拆分两数之和Ⅱ-输入有序数组2)...原创 2019-08-23 21:10:37 · 1186 阅读 · 0 评论 -
leetcode刷题技巧之双指针技巧练习题
160、 相交链表:class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *cursorA = headA; ListNode *cursorB = headB; if (!cursorA || !...原创 2019-03-16 21:10:33 · 451 阅读 · 0 评论 -
前缀树(清晰明了,不懂问我)
前缀树的定义:又称单词查找树,字典树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。前缀树的性质:1)根节点不包含字符,除根节点外每一个节点都只包含一个字符2)从根节点到某一节点,路径...原创 2019-09-06 20:34:50 · 3391 阅读 · 1 评论 -
八大排序算法的稳定性及时间复杂度
前言:首先清楚何谓稳定性?通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在Aj位置前,排序后Ai还是要在Aj位置前。判断方法:对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必>须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的...原创 2019-08-26 23:05:19 · 51881 阅读 · 4 评论 -
字符串模式匹配之KMP算法
前言:很多新人起初在学习KMP算法时,总是无法理解这个算法。确实是这样的,这个对于新人确实是比较晦涩难懂的,这里我假设你已经被KMP折磨一段时间了,我就来以代码实现和原理分析来帮助你理解KMP以及next[j]数组的实现方式。KMP算法:在文本串中寻找模式串是否存在,若存在返回的是完全匹配的第一个字符串的下标;若不存在返回-1。我们用指针i指向文本串中的字符,指针j指向模式串中的字符。Q...原创 2019-08-25 11:41:30 · 791 阅读 · 0 评论 -
红黑树原理分析及代码实现
前言:因为前两天在看STL源码刨析和牛客网的C++招聘,面试题就是问STL中的set和map是基于红黑树而实现的关联容器,你能说说红黑树嘛?红黑树,对于本菜鸟来说显得既陌生又熟悉,熟悉是因为听别人谈及的很多,陌生是因为这个对于本菜鸟来说只是个宽泛的概念,自己并不了解(哭了呜呜呜)。好吧,废话说了这么多,开始正题吧。为了说明红黑树,我们应该用2-3树作为铺垫来讲解,因为直接讲红黑树,会让第一次接...原创 2019-08-17 08:07:34 · 962 阅读 · 0 评论 -
二叉堆:优先队列的实现与堆排序
二叉堆数据结构二叉堆能很好地实现优先队列priority_quque的基本操作,在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素。**堆有序:**一棵二叉树的每个结点都大于等于它的两个子结点,n个元素序列为{k1,k2,…,kn},满足=={ki>=k2i,ki·>=k2i+1},这样建立起来的堆成为大根堆==;反之一棵二叉树的每个结点都小于等于它的两个子结点,即==...原创 2019-08-15 22:30:38 · 2375 阅读 · 0 评论 -
leetcode刷题总结之BFS与DFS
DFS算法:一直往深处走,直到找到解或者走不下去为止。BFS算法:一层一层的搜索,直到找到解或者点全部访问完为止。DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进出队列。用途:DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更...原创 2019-08-11 21:06:41 · 3200 阅读 · 4 评论 -
二叉树的前序遍历、中序遍历、后序遍历、层序遍历的时间复杂度和空间复杂度
非递归版:由于不管是先序遍历还是中序遍历以及后序遍历,我们都需要利用一个辅助栈来进行每个节点的存储打印,所以每个节点都要进栈和出栈,不过是根据那种遍历方式确定节点的进栈顺序,所以时间复杂度为O(n),同样空间复杂度也为O(n),n为结点数。层序遍历是通过队列来进行每个节点的存储打印的,所以时间复杂度和空间复杂度也与前三种遍历方式一样。递归版:空间复杂度与系统堆栈有关,系统栈需要记住每个节点...原创 2019-05-11 16:11:27 · 39456 阅读 · 15 评论 -
单向链表:获取、插入、删除、创建、合并、遍历等操作
1、单向链表的头文件的声明:#define OK 1#define ERROR 0typedef int ElemType;typedef int Status;typedef struct LNode{ ElemType data; //数据域 struct LNode* next; //指针域}LNode,*LinkList;//获取元素Status GetElem_...原创 2019-03-12 23:09:06 · 880 阅读 · 0 评论 -
顺序表:创建、删除、插入、遍历等操作
顺序表的声明和宏定义:typedef int Status;typedef int ElemType;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1constexpr auto OVERFLOW = -2;#define LIST_INIT_SIZE 100 //线性表...原创 2019-03-10 18:08:43 · 2482 阅读 · 0 评论 -
leetcode刷题总结之递归
前言:最近刷完leetcode递归的专题了,无奈本人很菜,关于递归每次都是看大佬的题解,自己也设计不出来递归,今日打算仔细分析递归题,总结以下。递归:在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递和归,这正是递归思想的精华所在。...原创 2019-09-25 16:42:52 · 4277 阅读 · 1 评论