
笔记
文章平均质量分 69
&矢志不渝^O^
这个作者很懒,什么都没留下…
展开
-
算法日记(十四)之并查集
今天,我们来看看一种特殊的数据结构——并查集。这是今天在《趣味数据结构》这本书中的高级数据结构中看到的,以前都没听过的一种数据结构。下面让我们一起来看看吧1.概论:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。主要构成:并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。数组 pre[ ] 记录了每个点的前驱节点是谁,函数 find(x) 用于查找指定节点 x原创 2022-06-01 14:40:15 · 136 阅读 · 0 评论 -
算法日记(十三)之动态规划
前面我们说过简单的背包问题可以用贪心算法来实现,但有一类0-1背包问题用贪心算法来实现是不可取的,这里就引出我们今天的主角——动态规划。1.动态规划的相关概念:这里就不引用百度上的专业名词了,简单的来说,动态规划其实就是,给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后呢,把子问题答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法。一般这些子问题很相似,可以通过函数关系式递推出来。然后呢,动态规划就致力于解决每个子问题一次,减少重复计算,比如斐波那契数列就原创 2022-05-29 17:51:23 · 121 阅读 · 0 评论 -
算法日记(十二)之贪心算法
在前面我们已经有分享过递归和回溯算法的思想,再结合最近在学图的应用时,遇到最小生成树和最短路径等问题时,都提到一个贪心的思想。今天,我们就来总的看一下这个贪心算法的内容吧贪心算法(有时也叫贪婪算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果贪心算法一般按如下步骤进行:①建立数学模型来描述问题 。②把求解的问题分成若干个子问原创 2022-05-29 16:44:01 · 199 阅读 · 0 评论 -
算法日记(十一)之B树与B+树
在我们说树的基础知识就说过,树有几种分类,如二叉树,平衡二叉树以及红黑树等等。下面我们来看看另一种树的性质——B树与B+树。它们是我们数据库MySQL的索引结构的数据结构。对于索引优化和原理理解都非常重要。下面一起来看看吧一.B树概述(有时候也被叫做B-树)B树和AVL树(平衡二叉树) 的差别就是 B树 属于多叉树,又名平衡多路查找树,即一个结点的查找路径不止左、右两个,而是有多个。数据库索引技术里大量使用者B树和B+树的数据结构。一个结点存储多个值(索引)。这里的 B 表示 balance( 平衡原创 2022-05-29 00:57:40 · 216 阅读 · 0 评论 -
算法日记(十)之跳表
今天,我们来看一种数据结构,它可以快速地查找、插入、删除。据说可以替代红黑树。据说Redis中的有序集合就是用它来实现的。它就是跳表。初学者学数据结构应该都没有听说过,课本也没有出现过这种数据结构过。下面我们一起来看看吧一.定义1.跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能2.跳表在原来的有序链表上加上了多级索引,通过索引来快速查找;可以支持快速的删除、插入和查找操作。3.跳表实际上是一种增加了前向指针的链表,是一种随机化的数据结构4.Redis中 的 SortedS原创 2022-05-28 23:40:08 · 194 阅读 · 0 评论 -
算法日记(九)之优先队列
在前面,我们已经分享完队列的基本内容,现在我们来看看队列衍生出来的一种数据结构——优先队列。优先队列行为像队列,但先出队列的元素不是先进队列的元素,而是队列中优先级最高的元素。优先队列是与堆,树相结合的一种数据结构。下面一起来看看吧1.概念优先队列可以插入元素、查询最大值、删除最大值。优先队列其实就是最大堆或最小堆,最大堆可以用来实现最大优先队列,最小堆可以用来实现最小优先队列。用各种堆都可以实现优先队列。优先队列分为几种,下面一起来看看吧2,分类(一).STL优先队列注意:优先队列如果原创 2022-05-28 20:04:00 · 482 阅读 · 0 评论 -
算法日记(八)之堆的基本操作
今天,我们来看看堆这种数据结构以及它其中的一方面——优先队列1.堆如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<=K2i+2 ,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。补充:在内存中,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。2.性质:1.堆中某个节点的值总是不大于或不.原创 2022-05-28 15:26:02 · 392 阅读 · 0 评论 -
算法日记(七)之红黑树(基础版)
今天,我们来看看二叉树中的一种特殊结构——红黑树。网上也都流传说红黑树在平时程序员面试中经常出现,且会出现得比较难。虽然红黑树在《数据结构与算法》这本书中没有提高,但还是有必要学好红黑树。学红黑树以前,我们有必要来复习二叉排序树的内容(博主前面的文章有一期是关于二叉排序树的)。1.复习二叉排序树二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。2.红黑树:当原创 2022-05-22 18:50:35 · 113 阅读 · 0 评论 -
leetcode刷题日记(二十一)
在经历了一段时间的停更后,我们每晚一度的leetcode刷题时间正式回来,博主会给大家分享每晚一道leetcode题,跟大家一起刷题,大家一起体会刷算法题的乐趣,从此刷算法不再无聊。好啦,直接上题目吧,今天给大家带来一道二叉树的题目。核心思路:递归(没错,就是我们的老朋友——递归,在做二叉树的时候递归应该是我们首先要考虑的解题核心)首先先递归遍历到左边叶子结点,进行左右交换,再往上退到根节点,先递归遍历到右边叶子结点。进行右左交换。再往上退到根节点,对根结点的左右结点进行左右交换,注意最下面的叶子结点也原创 2022-05-20 01:34:07 · 147 阅读 · 0 评论 -
Leetcode刷题日记(二十)
又是老台词:“欢迎大家来到一晚一度的leetcode刷题时间”。我们紧接着上期的leetcode刷题时间的内容,继续讲解树的经典题目。今天这一道呢是关于求左子树的和的题目(求右子树的和类推)。废话不多说,直接上题目题目:解题方法还是我们的老朋友——深度优先搜索啦解题代码(c++版):class Solution {public: bool isLeafNode(TreeNode* node) { return !node->left &&...原创 2022-04-20 01:18:18 · 230 阅读 · 0 评论 -
算法日记(六)之串的模式匹配(二)
在前一期文章博主发表了串的模式匹配——BF算法,相信大家很清楚明白。今天我们来看看另一种匹配算法,另一块难啃的骨头——KMP算法。KMP算法相信大家都有多少了解过。博主刚开始学也是很模模糊糊,记得自从大一寒假学完数据结构到现在,KMP算法至今琢磨过三四遍,才初步弄懂原理。如果你是第一次接触KMP算法,我想劝你不要放弃,每隔一段时间多去琢磨琢磨,随着次数增加,理解程度也会更深。这种算法其实讲起来也不是很好讲,更多要靠自己去想,自己去悟。下面博主尽量用易懂的语言来讲讲吧。首先,先引入一个概念:一个字符串最长原创 2022-04-20 00:55:18 · 161 阅读 · 0 评论 -
算法日记(五)之串的模式匹配(一)
在学习《数据结构与算法》这本书,主要知识点是几种常见的数据类型如线性表,树和图等。但也有几种数据结构是我们不容忽视的,如栈,队列,串和广义表等等。今天难得有空就来分享一下串的基础知识,其实串(实质指字符串)在我们日常中应用很广泛,我们都相对很熟悉。串对应也有一种容器string,在前面的c++常见几种容器中讲过。今天主要来分享一下串的考试重难点——模式匹配,包括BF算法和KMP算法。下面一种一种来看看吧1.BF算法(暴力算法,简单但效率低):BF算法思路直观简洁,但当匹配失败时,主串的指针 i 总是原创 2022-04-19 18:19:28 · 487 阅读 · 0 评论 -
Leetcode刷题日记(十九)
又是老台词:“欢迎大家来到一晚一度的leetcode刷题时间。”经过博主的思考,今天博主决定给大家分享数据结构中很重要的一种数据结构——树。关于树(包括二叉树)的基础知识及相关代码实现,博主这几天也在陆陆续续地分享给大家。关于树这种数据结构的题目可以说很多,所以博主会分很多期文章分享一下经典题目。下面直接上题目(先从简单题开始吧):题目:解题代码(深度优先搜索(我们的老朋友,在树的题目中我们会经常遇到它的)):思路:如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个..原创 2022-04-18 01:16:44 · 768 阅读 · 0 评论 -
Leetcode刷题日记(十八)
又是老台词:欢迎大家来到一晚一度的leetcode刷题时间。首先,博主也自我检讨一下,由于昨晚和宿友出去喝酒了,导致昨晚停更了每晚必备的leetcode刷题日记。在此博主表示深深抱歉。因此博主今天决定来分享一下和递归算法地位相同的一种算法——回溯算法。回溯法解决问题我记得在前面一期文章中曾用来解决八皇后问题。感兴趣的同学可以去看看博主曾经分享的文章。回溯法其实本质就是深度优先搜索(这后面会见到)。回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中原创 2022-04-17 01:48:46 · 181 阅读 · 0 评论 -
C++实践项目之职工管理系统
最近博主也是花了两三天时间跟着视频学了一个c++实践项目--职工管理系统。完成后也是迫不及待地给大家分享,大家感兴趣可以自己上机试试(分文件有点多)。1.Boss.cpp代码:#include"boss.h"Boss::Boss(int id, string name, int did){ this->id = id; this->name = name; this->did = did;}void Boss::showInfo(){ co...原创 2022-04-14 15:03:24 · 578 阅读 · 0 评论 -
Leetcode刷题日记(十七)
老台词虽迟但到:欢迎大家来到一晚一度的leetcode刷题时间。今天我们继续讲一下我们的老朋友--递归(最后一期啦)。递归的重要性我就不多说啦,今天我们就用它来判断某个数是否为某个数的幂次方。下面上题目:有一种较为取巧的做法。在题目给定的 3232 位有符号整数的范围内,最大的 22 的幂为 2^{30} = 1073741824.我们只需要判断 nn 是否是 2^{30}的约数即可。解题代码:class Solution {private: static constexpr in..原创 2022-04-14 01:56:42 · 250 阅读 · 0 评论 -
Leetcode刷题日记(十六)
老台词还是那句:欢迎大家来到一晚一度的leetcode刷题时间。总觉得今天少了点什么,原来是今天没有发文章。今天忙于项目的答辩和写一个职工管理系统(后几期后呈现给大家看的,放心)。刚好,在这夜深人静的时候,来一道leetcode题练练手吧。今天我们还是老样子,讲我们的老朋友--递归。这篇文章讲用递归解决重排链表的问题,下面直接上题目:用线性表解题:class Solution {public: void reorderList(ListNode *head) { i...原创 2022-04-13 01:18:38 · 161 阅读 · 0 评论 -
Leetcode刷题日记(十五)
老台词:欢迎来到一晚一度的leetcode刷题日记时间。今天我们继续来讲讲我们学习算法的重要朋友--递归。递归的重要性上篇刷题日记已经提到不少了,这就不罗嗦了。今天我们来看看一道回文链表的题目,继续体会递归的妙用。(好像前几期有讲到回文字符串)。直接上题目:第一种解题方法(双指针方法):步骤:复制链表值到数组列表中。 使用双指针法来比较两端的元素,并向中间移动。一个指针从起点向中间移动,另一个指针从终点向中间移动解题代码:class Solution {public: .原创 2022-04-12 01:52:57 · 664 阅读 · 0 评论 -
算法日记(四)之回文字符串
今天在刷公众号的时候,刚好看到一篇关于回文字符串的文章,这个名词说实话博主还真没听过(好吧,是博主眼界窄)。点进去发现其实解决方法很常见就是利用循环。所以我特地写一篇文章来说说这个回文字符串问题。说不定还有同学没听过回文字符串。hhhh。所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"level" 、 “aba”。回文数依次类推解题代码(C语言版):#include<stdio.h>#include<string.h>#define NUM原创 2022-04-10 18:36:22 · 991 阅读 · 0 评论 -
Leetcode刷题日记(十三)
又是老台词:欢迎大家来到一晚一度的leetcode刷题日记。今天我们来看看我们的一位“朋友”--递归。没错,就是他,可能编程小白在学C语言时心里的噩梦就是他,别看他只是短短两个,其实他变起花样来,连博主都怕,真的。其实,递归是研究算法问题最常见见到的朋友之一(后面的回溯也是,hhh剧透一下)。所以博主决定用几篇的文章来致敬一下老哥,以此突出他的重要性。下面直接上题目。我们先从最简单的斐波那契数列开始(小白最常遇到的问题):解题代码(最简单的C语言版,其实此题c++写也是一样的):nt fib原创 2022-04-10 01:48:33 · 226 阅读 · 0 评论 -
Easyx图形库(进阶版)
在最近的组队做坦克大战项目中,我也是丰富了自己的知识库,学会了easyx的几种以前没有接触过的函数,由于在之前的文章原创 2022-04-10 01:25:55 · 2130 阅读 · 1 评论 -
Leetcode刷题日记(十二)
又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间。今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧。队列这方面的问题平时博主也是接触得比较少的。下面是一道利用队列解决问题的简单经典题目。下面直接上题目:解决思路:对字符串进行两次遍历。在第一次遍历时,我们使用哈希映射(从未听过的东西)统计出字符串中每个字符出现的次数。在第二次遍历时,我们只要遍历到了一个只出现一次的字符,那么就返回它的索引,否则在遍历结束后返回 --1。解题代码(C语言版,用c原创 2022-04-09 01:54:52 · 358 阅读 · 0 评论 -
Leetcode刷题日记(十一)
又来到一晚一度的leetcode刷题时间啦,虽会迟但会到的。真的,博主无论多忙,在晚上想睡觉之前都会想起给大家分享题目的事情,这可能已经慢慢地成为每天睡前必做的事了。好啦,废话不多说,今天我们来看看栈和队列结合的题目吧,这是一道用栈来实现队列的题目。下面直接上题目:这道题的思路是使用两个栈,将一个栈当作输入栈,用于压入 \texttt{push}push 传入的数据;另一个栈当作输出栈,用于 pop和 peek 操作。每次pop 或peek 时,若输出栈为空则将输入栈的全部数据依次弹出.原创 2022-04-08 01:37:26 · 156 阅读 · 0 评论 -
Leetcode刷题日记(十)
又来到一晚一度的leetcode刷题时间。今天我们继续看双指针。为什么总是分享双指针的题目?肯定是因为经典又好用啦。好啦,分享最好一道双指针的题目(应该是最后一道了,明天博主努力找别的知识点的经典题目,hhh)。直接上题目:基本思路;我们初始化两个指针 ii 和 jj,分别指向 ss 和 tt 的初始位置。每次贪心地匹配,匹配成功则 ii 和 jj 同时右移,匹配 ss 的下一个位置,匹配失败则 jj 右移,ii 不变,尝试用 tt 的下一个字符匹配 ss。最终如果 ii 移动到 ss.原创 2022-04-07 01:27:49 · 481 阅读 · 0 评论 -
Leetcode刷题日记(九)
又来到一天一度的leetcode刷题日记啦。今天是清明节放假最后一天,博主今天也没闲着。早上做团日活动ppt,下午写it文化节作品和项目架构,晚上又项目小组开会,刚刚洗澡完和宿友撸了几把王者,才想起今天没有刷leetcode题。好啦,废话不多说,今天看题库发现一道算经典的题目,解题方法还是我们的老朋友双指针啦。下面直接上题目:解题方法:class Solution{public: int removeElement(vector<int>& nums, i...原创 2022-04-06 00:41:39 · 101 阅读 · 0 评论 -
Leetcode刷题日记(七)
又来到一天一度的leetcode刷题时间啦,老样子,先讲一下今天给大家分享的题目--环链表题目(hhh,又是链表,毕竟人家真的很重要啦)好啦,废话不多说,直接上题目:解题思路:博主一看到这道题,心里一喜,这不就是双指针中快慢指针的应用吗,之前一直没有讲到快慢指针的应用,今天终于机会来了。其实这道题利用快慢指针解题会方便不少,一起来看看吧。解题代码(这里类比了自行车与汽车追赶问题):class Solution {public: bool hasCycle(ListNode *...原创 2022-04-04 01:56:52 · 784 阅读 · 0 评论 -
算法日记(三)之回溯法解决八皇后问题
回溯法是算法中很常见的一种(在后面的树我们会经常和它打交道)。先简单说一下概念吧(详细的后面讲树再说吧):回溯法从问题本身出发,寻找可能实现的所有情况。和穷举法的思想相近,不同在于穷举法是将所有的情况都列举出来以后再一一筛选,而回溯法在列举过程如果发现当前情况根本不可能存在,就停止后续的所有工作,返回上一步进行新的尝试。八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或原创 2022-04-04 01:40:11 · 218 阅读 · 0 评论 -
Leetcode刷题日记(六)
前一篇leetcode刷题日记我们讲到了双指针这一种的经典中的经典解题方法。今天呢我们继续来给大家分享一道leetcode中双指针的常见题目,解题方法也很简单,相信长期刷算法题的人都做得出来的。现在上题目:博主刚开始看到这道题目,第一反应想到的是vector动态数组的逆序(利用修改sort的第三个参数,这前面有讲到的)。而想起今天的主题——双指针,就想到了利用指针从两端向中间靠来交换字符(有点刚开始学C语言时的感觉,hhh)。下面是利用的双指针的解题方法:class Solution {pub原创 2022-04-02 14:49:14 · 463 阅读 · 0 评论 -
Leetcode刷题日记(四)
又来到每日睡前一leetcode时间啦,现在是凌晨一点半,刷完这到leetcode就睡觉,杜绝继续熬夜。下题目:解题方法:单指针法。第一次遍历这个链表,来确定链表的总长度n,第二次遍历链表的半长度,即n/2.这题目难度不高,适合小白做class Solution {public: ListNode* middleNode(ListNode* head) { int n = 0; ListNode* cur = head; while (c...原创 2022-04-01 01:40:15 · 925 阅读 · 0 评论 -
Leetcode刷题日记(三)
今天中午,我还是一如既往地利用午休时间,想刷一道leetcode题再进入午睡,意外地发现一道经典的链表题(删除某个特定结点)。博主想了一会,脑海里似乎有了思路,下面就让我们来看看这道经典题目吧题目:题解:classSolution{public:voiddeleteNode(ListNode*node) //注意这个node就是指向指定的结点,博主刚开始以为是指向头结点{node->val=node->next-&g...原创 2022-03-30 14:31:35 · 473 阅读 · 0 评论 -
算法日记(一)
今天在刷微信公众号时,发现了两道很经典,很常见的算法题目。用到的解题方法都是很常见的。下面就让我们来看看这两道题目吧第一道题目:链表题,用到的解题方法也是非常经典的双指针。题目:实现一个函数,查找链表的倒数第k个结点思路:使用两个指针,第一个指针先指向第k个结点,然后两个指针同时移动,第一个指针移动到末尾的时候,第二个指针刚好位于倒数第k个位置...原创 2022-03-29 21:54:20 · 148 阅读 · 0 评论 -
Leetcode刷题日记(二)
今天又来给大家分享leetcode上的一道关于链表的题目。虽然显示是简单题,但对于博主来说,这是一道经典题目。下面就让我们来看看吧解析:class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if (!head)//头指针为空,此链表没有 { return head; } ListNode* cur = head;//c...原创 2022-03-28 23:55:33 · 303 阅读 · 0 评论 -
Leetcode刷题日记(一)
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。提示:两个链表的节点数目范围是[0, 50] -100 <= Node.val <= 100 l1和l2均按非递减顺序排列哨兵结点法:class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* preHead = new ...原创 2022-03-27 23:35:56 · 79 阅读 · 0 评论 -
Easyx图形库基本用法
Easyx常见必备头文件:#include<graphics.h>//必备#include<conio.h>#include<mmsystem.h>#include<easyx.h>#include<stdlib.h>#include<string>绘图方法:initgraph(640, 480, EW_SHOWCONSOLE);//创建窗口 closegraph();//关闭窗口,与创建窗口是..原创 2022-03-27 14:51:29 · 3849 阅读 · 1 评论