数据结构与算法
文章平均质量分 67
_好好学习
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++实现优先级队列模板类
1. 优先级队列1.1 基本原理仿照C++ STL 中的优先级队列priority_queue,主要实现以下功能:向队列中添加元素后,队列自动调整,保证队列中优先级最高的元素在队列头部(优先级可以定义比较函数,按照大小或者其他条件决定); 每次出队元素是队列中优先级最高的,因此优先级队列不满足先进先出的原则,而是根据每次都是优先级最高的先出。优先级队列ADT的API如下: 方法名 功能 push() 添加一个元素原创 2021-03-12 15:45:46 · 936 阅读 · 0 评论 -
数据结构与算法——常见排序算法写成模板,新建命名空间打包带走
1. 前文汇总前面陆陆续续总结过常用排序算法,如下:数据结构与算法——快排序数据结构与算法——插入排序C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减数据结构与算法——插入排序——使用C++实现函数模板、数据结构与算法——希尔排序数据结构与算法——选择排序2. 常用排序算法整理将常用的排序算法进行了实现,写成了模板,并放在了一个命名空间下面。包括插入排序,选择排序,希尔排序,快排序,堆排序和归并排序。需要注意的就是模板的特化,不能将模板函数原创 2020-09-03 14:43:28 · 467 阅读 · 0 评论 -
数据结构与算法——并查集(Union-Find)
1. 原理/概念并查集(Union-Find)主要用来解决无向图的【动态连通性】问题,对于无向图的连通,一般具有如下几个性质:自反性:节点p和 p 是连通的; 对称性:如果节点 p 和节点 q 连通,那么节点 q 和 p 也是连通的; 传递性:如果节点 p 和 q 连通, q 和 r 连通,那么 p 和 r 连通。本文参考一个大神labuladong的算法小抄:Union-Find算法详解,主页在这。注意,并查集只能用来解决无向图的连通性的问题,如果是有向图,要找其强连通分量,需要用t..原创 2020-09-03 10:44:37 · 698 阅读 · 0 评论 -
剑指 Offer(39):数组中出现次数超过一半的数字
1. 题目描述2. 题目理解方法1:哈希表记录元素出现次数最直观,最容易想到的,就是记录数组中每个元素的个数,使用哈希表(unordered_map)来记录数组中不同元素出现的次数。然后出现次数大于数组长度一半的那个元素就是要找的元素了。这个思路实现起来比较简单,时间复杂度O(n),空间复杂度O(n)。方法2:基于快排的思想快排每轮定位一个元素的位置,然后通过该元素的位置与数组中间位置进行比较,决定下一轮快排的区间。直到定位的那个元素刚好落在数组的中间位置。方法3:摩尔投票数原创 2020-08-24 11:10:23 · 269 阅读 · 0 评论 -
剑指offer(47):礼物的最大价值
1. 题目描述2. 题目理解典型的动态规划问题,直接看状态数组的定义:状态数组:dp[i][j]表示从起始位置到(i,j)能获得的最大的价值。状态转移方程:dp[i][j] = grid[i][j] + max( dp[i-1][j], dp[i][j-1] )就是,在当前grid[i][j]所能获得的最大价值=上一个位置所能获得的最大价值+当前位置的价值,其中上一个位置可以是在当前位置的正上方,也可以是当前位置的左边。base case:就是在矩阵的最上一条边和最...原创 2020-08-23 15:11:46 · 166 阅读 · 0 评论 -
剑指offer(46):把数字翻译成字符串
1. 题目描述2. 题目理解最先想到的可能是递归,从第一个数字开始翻译,然后判断前两个数字能不能合并一起翻译,然后一直递归下去。用递归的话势必会存在重叠子问题,存在重叠子问题的话,可以用备忘录来进行剪枝。递归从最大的问题开始自上而下解决问题,我们也可以从最小的子问题开始自下而上解决问题了,这样可以消除重复问题。重叠子问题想到动态规划,是一个比较顺的思路了,我们从最小的子问题开始,就是从num的最后,对应的是dp[len-1]。动态规划,状态数组定义:dp[i]表示从num[i]到结尾原创 2020-08-23 14:58:37 · 220 阅读 · 0 评论 -
数据结构与算法——选择排序
1. 选择排序的基本原理原理详解可以参考浙大的数据结构与算法。简单说选择排序的思想就是:选择排序每趟遍历未排序的序列,从其中选出一个元素(升序就选最小的,降序就选最大的),将其与无序区最前面的元素交换,使得有序区元素个数+1,无序区元素个数-1。这样每趟遍历可以从无序区中挑一个元素放到有序区中,直到最后无序区中元素个数为0.2. C++实现选择排序原理比较简单,这里就直接贴代码:选择排序功能函数:/** * @brief 选择排序主函数,提供通用的外部接口 * @param[i原创 2020-08-04 14:37:02 · 311 阅读 · 0 评论 -
数据结构与算法——希尔排序
1. 希尔排序基本原理原理详解可以参考浙大的原创 2020-08-01 13:31:22 · 394 阅读 · 0 评论 -
数据结构与算法——插入排序——使用C++实现函数模板
1. 插入排序原理插入排序是最基本的排序算法,之前写过一篇文章实现插入排序,不过是用的C语言+函数指针,使得用户可以自定义升序排序还是降序排序。现在考虑使用C++,将该算法做成一个函数模板。2. 将排序算法做成函数模板几个关键字:【函数模板】,【函数对象】,【匿名函数】,【友元函数】。对于基本数据类型,构建函数模板比较简单,排序的比较也可以直接用STL里面的less和great函数对象。对于自定义类型的数据,需要实现自定义类型对象的比较,可以1)重载比较运算符,less重载"<"运原创 2020-07-31 21:25:55 · 1165 阅读 · 0 评论 -
C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减
1. 归并排序几个高级排序算法之一,具体原理可以参考这个视频:归并排序算法讲解。基本原理就是使用分治的思想,将数组不断二分,分割成单个元素,然后从单个元素开始两两合并,将两个有序的数组片段合并为一个新的有序片段。最后将整个数组归为有序。基本步骤:将数组不断二分,分割成只包含单个元素的片段; 对分割之后的片段进行两两合并,将两个片段合并为一个有序的大片段,最底层是对于单个元素的片段进行合并,单个元素肯定有序,合并只需要根据两个元素的大小进行片段的重排。需要使用额外的内存空间保存两个子片段,然后在原创 2020-07-26 16:51:47 · 461 阅读 · 0 评论 -
C++——list(线性双向链表)
1. 基本概念list也是C++ STL中提供的一种容器,是线性的双向链表的数据结构。拥有链式结构的特征:支持元素的快速插入和删除,但是元素随机访问较慢(相较于vector容器),不提供[]运算符的重载。C++中使用list容器需要包含头文件<list>,把list当做双向链表来看,可以记住list的常用操作,如下:push_back():添加元素到list尾部。 push_back():添加元素到list头部。 pop_back():从list尾部删除元素。 pop_front(原创 2020-06-09 18:32:10 · 1606 阅读 · 0 评论 -
C++——优先级队列(priority_queue)
1.优先级队列(priority_queue)1.1 基本概念之前已经提到了队列(queue),队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。优先级队列(priority_queue)其实,不满足先进先出的条件,更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。比如定义元素越大优先级越高,那么每次出队,都是将当前队.原创 2020-06-04 17:26:39 · 33788 阅读 · 4 评论 -
C++——双端队列(deque)
1. 双端队列(deque)双端队列(deque)是队列的一种变形,一般队列只能在队尾添加元素(push),在队首删除元素(pop),双端队列则同时在队首或者队尾执行添加和删除工作。C++中,使用双端队列需要包含头文件<deque>。C++中队列的基本操作如下:push_back():在队列尾部添加元素,无返回值。这个操作跟普通队列(queue)的push()方法类似,在队列的尾部添加一个元素; push_front():在队列头部添加元素,无返回值; pop_back():删除队列原创 2020-06-03 22:31:44 · 22047 阅读 · 1 评论 -
C++——队列(queue)和栈(stack)
1. 队列(queue)队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。C++中,使用队列需要包含头文件<queue>。C++中队列的基本操作如下:push() :入队。在队列尾端添加一个元素,无返回值; pop() :出队。将队列头部元素删除(出队),无返回值; front() :获得队列头部元素。此函数返回值为队列的头部元素,常与pop()函数一起,先通过front()获得队列头部元素,然原创 2020-06-01 18:44:01 · 6339 阅读 · 2 评论 -
LeetCode(46):全排列
1. 题目描述2. 题目理解看到这道题,就是典型的“回溯”问题,可以使用回溯算法来解决。回溯也是递归的过程,这里写了一下回溯算法的简单框架://回溯算法的框架void backTrack(最终结果(res),子结果(subRes),选择列表){ if(满足结束条件)结果中新增该项; for(遍历选择列表){ if(该项选择已经被包含在subRes中)continue; 将该选择项包含在子结果中; backTrac原创 2020-05-29 12:22:26 · 348 阅读 · 0 评论 -
数据结构与算法——03-树1 树的同构(浙大陈姥姥《数据结构与算法》)
1. 题目描述给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N(≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母..原创 2020-05-26 15:11:15 · 539 阅读 · 0 评论 -
LeetCode(204):计算质数
1. 题目描述2. 题目理解题目看着很简单,最先想到的就是做一个判断是不是质数的函数(isPrim),然后对n以内的正整数做个遍历,判断是质数的话,计数器count++,最傻瓜的代码如下:int isPrime(int n);//该函数用来判断传入参数是不是质数,是:返回1;不是:返回0int countPrimes(int n){ int cnt=0; for(int i=1;i<n;i++){ if(isPrime(i))cnt++; }原创 2020-05-26 10:02:59 · 761 阅读 · 0 评论 -
LeetCode(105):从前序与中序遍历序列构造二叉树
1. 题目描述2. 题目理解前序遍历数组的首元素一定是当前子树的根节点。根据这一性质,找到当前子树的根节点,然后查找该节点在中序遍历数组中的位置,可以得到当前根节点左子树中元素的个数。将中序遍历按照根节点分为左右两部分,对应左右子树的中序遍历;同时将前序遍历按照根节点以及根节点左子树中元素的个数,也分成左右两部分,对应左右子树的前序遍历。按照以上思路,用递归的方式可以构造出整个树。3. 代码3.1 C语言代码/** * Definition for a binary tree原创 2020-05-25 11:16:05 · 213 阅读 · 0 评论 -
数据结构与算法——03-树2 List Leaves(浙大陈姥姥《数据结构与算法》)
1. 题目描述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 positive integerN(≤10) which is the total num..原创 2020-05-24 09:32:01 · 357 阅读 · 1 评论 -
数据结构与算法——插入排序
还是先上算法视频讲解:浙大——数据结构与算法(插入排序)1. 算法实现插入排序作为简单排序的一种,可能是每个人天生就会的算法(谁还没打过扑克牌呢?),就想打扑克整牌的时候,将最小的牌一般会放在手中最左边,一手牌就是个升序排序的过程。直接贴算法://插入排序算法,升序算法void insertSort(int* arr,int num){ int i,j; for(i=1;i<num;i++){//从位置1开始,到数组的最后 int tmp=arr[i];原创 2020-05-21 11:57:27 · 298 阅读 · 0 评论 -
数据结构与算法——快排序
先上浙大陈姥姥的视频连接,我觉得看这个视屏讲的很好。浙大数据结构与算法——快排序原理部分还可以参考《大话数据结构》程杰【著】。1. 算法实现单看陈姥姥的视频,算法实现的伪码描述部分有一点点问题,照着写程序的话会出问题。就是这里for(;;)循环,有点问题是,如果for(;;)跳出之后,此时i可能大于right-1,这样会造成错误,因此最外层的swap应该判断一下i和right-1的大小。代码如下:快排序主函数,提供通用的外部接口。//快排序主函数,提供通用的外部接口void QS原创 2020-05-20 17:46:44 · 267 阅读 · 3 评论 -
数据结构与算法——链表
1. 线性单链表1.1 抽象定义 类型名 链表。类型属性存储一些列项,运行时确定大小,支持元素的快速插入和删除。类型操作读取任意节点元素;在任意节点位置插入元素;删除已有节点元素;清空整个链表。1.2 代码实现1.2.1 接口定义如下,接口定义在linklist.h文件中://文件名:Linklist.h //主要作用:定义链表的数据接口 #ifndef _LINKLIST_H_#define _LINKLIST_H_#include <原创 2020-05-17 16:31:57 · 703 阅读 · 0 评论 -
KMP模式匹配算法
1. 从朴素的模式匹配算法讲起基本问题:从主串S中,找到T这个字串的位置。例如:主串S:“goodgoole”,字串T:“goole”,得到结果T在S出首次出现的位置在S起始字符开始第五个字符。这种字串定位问题称为“串的模式匹配”朴素算法思路最简单,就是每次从S的第i个字符开始比较,判断S中第i+j字符是否与T中第j个字符相等,相等的话j++,直到i+j超过S的长度或者j超过T的长度,然后返回(i+j超过S的长度:返回-1,表示主串中不存在字串;j超过T的长度:返回I,表示主串中子串的初始位原创 2020-05-10 14:30:52 · 326 阅读 · 0 评论 -
数据结构与算法——平衡二叉树(AVL树)
1.平衡二叉树(AVL树)1.1 定义平衡二叉树(Self-Balancing Binary Search Tree,Height-Balancd Binary Search Tree),是一种二叉排序树,其中每个节点的左子树和右子树的高度差不超过1.有两名俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年共同发明了一种解决平衡二叉树的算法,因此平...原创 2020-05-07 21:08:06 · 718 阅读 · 0 评论
分享