自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 操作系统“权限”是什么?——一篇文章带你深刻理解Linux下权限

记住一句话。

2025-02-21 19:49:36 4265 3

原创 初步认识数据库

显然,从名字上来看,数据库是一个存储数据的库。总所周知,文件也能存储数据。

2025-02-21 16:53:05 4858

原创 Linux常用指令总结及注意事项(二)

书接上文,在上一篇博客里分享了13个常用指令,这篇博客继续分享一些常用的指令。

2025-02-19 16:58:12 1893 1

原创 数据结构:图(三)----- 最短路径

除了最小生成树,图还有一项重要的应用,就是求最短路劲这篇博客分享一下最短路径的三大算法。

2024-11-19 11:29:05 1762

原创 数据结构:图(二)---- 最小生成树算法

连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不在连通;反之,在其中引入任何一条新边,都会形成一条回路。若连通图由n个顶点组成,则其生成树必含n个顶点和n-1条边。因此构造最小生成树的准则有三只能使用图中的边来构造最小生成树只能使用恰好n-1条边来连接图中的n个顶点选用的n-1条边不能构成回路感性来说,最小生成树,就是所有边的权值和最小的生成树。构造最小生成树主要有两种算法,分别是Kruskal算法和Prim算法。

2024-11-17 21:40:04 1126

原创 数据结构:图(一)---- 图的基础和遍历

图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中:顶点集合V = {x|x属于某个数据对象集}是有穷非空集合;E = {(x,y)|x,y属于V}或者E = {<x, y>|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫做边的集合。简单来说,图(graph)包含两个部分:顶点(vertex)和边(edge),所以很多地方将图写成G = (V,E)老规矩,讲完定义,上图看看。

2024-11-15 22:54:35 1325

原创 算法:只出现一次的数字II

我们只需要去获取这个只出现一次的元素在每一个bit位上的数字即可。数组中只有一个元素只出现一次,其他的元素都出现三次。那么所有的元素的第i位的和加起来只有下面的四种情况。这道题目其实是一个观察题,比较考察观察能力。结果与仅出现一次的元素在该位上的数字一样。我们假设有n个元素出现三次。所以,我们的思路就出来了。我们将其%3 会发现。

2024-11-04 23:12:53 796 1

原创 算法:判定字符是否唯一(位图思想)

位图 (Bitmap) 是一种基于位操作的数据结构,用于表示一组元素的集合信息。它通常是一个仅包含0和1的数组,其中每个元素对应集合中的一个元素。位图中的每个位(或者可以理解为数组的元素)代表一个元素是否存在于集合中。当元素存在时,对应位的值为1;当发现字符对应的下标在位图中为1的时候,就代表字符已经存在过,返回false。具体热河判断某一位为1,等位运算的操作,可以看之前的博客中的讲解。在这道题目中,我们可以用0来表示字符存在,1表示字符不存在。否则,将其置为1,继续下一个字符的判断。

2024-11-04 23:00:29 927

原创 数据结构:LRUCache

首先我们来看看什么是cache缓存(Cache)通常用于两个速度不同的介质之间,以提高数据访问的速度和效率。那么问题来了,cache满了怎么办?显然,满了就需要删除掉旧的,替换进去新的内容。但是该如何替换呢?也就是替换策略是什么样的呢?目前,最常用的替换策略就是(Least Recently Used),意思是最近最少使用,也就是当cache满了以后,用新的数据替换最近最少使用的数据。顾名思义,。

2024-11-04 21:25:38 1134 1

原创 算法:常见位运算技巧总结

按位与 & :有0为0,无0为1按位或 | :有1为1,无1为0按位异或 ^ :相同为1,不同为0按位取反 ~ :0变成1,1变成0左移 << : 二进制序列向左移右移 >> :二进制序列向右移。

2024-10-29 23:11:42 291 1

原创 数据结构:并查集

在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)。举个例子看看比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3,

2024-10-29 22:07:14 917

原创 算法:利用前序序列和中序序列构造二叉树

所以,我们需要一个变量i来遍历前序序列,注意,在递归中,我们需要引用或者指针来传递该参数。可以通过中序遍历去分割二叉树,将二叉树分割成 左子树 根 右子树。前序遍历的顺序是:根 + 左子树 + 右子树。中序遍历的顺序是: 左子树 + 根 + 右子树。找到根节点之后,在中序遍历中去寻找这个根节点,就可以将中序遍历分成三段了。后序遍历的顺序是 左子树 + 右子树 + 根。所以,我们可以通过前序遍历获得二叉树的根。

2024-10-28 22:21:40 644

原创 数据结构:二叉树的非递归遍历

在前面我们学习了二叉树的递归遍历,但是,众所周知,递归是比较消耗资源的,所以,在有些注重性能的地方,会需要使用到非递归遍历,在这里介绍一下,二叉树的非递归遍历。本质上:二叉树的非递归遍历也是模拟递归遍历,递归遍历中需要产生深层次的函数栈帧,而非递归就是将这些深层次的函数栈帧存起来模拟递归。

2024-10-28 22:00:44 668

原创 算法:KMP算法详解

BF算法即暴力求解字符串匹配的算法面对这样两个字符串,BF算法就是用两个指针,一个i,一个j,分别从s和t的开始位置开始依次匹配当遇到s[i] == t[0]的时候,此时有可能字符串匹配,需要进行检查于是从i开始,依次比较i后面的元素和t中的元素,如果恰好完全相等(次序,字母都相同),则返回i的下标即可如果遇到了s[i]!= t[j],则说明此处不匹配,i需要回退到比较前的i的下一个位置,j需要回退到0,重新开始进行比较。

2024-10-22 10:57:22 1091

原创 数据结构:红黑树

前面我们介绍了AVL树来解决搜索二叉树不平衡的问题,今天我们带来一种新的解决方案,同时,这种解决方案在实践中比AVL树更常用,这种数据结构就是红黑树。

2024-10-13 11:57:30 3078 1

原创 算法:525.连续数组

在该题中,要寻找一个连续子数组,使得其中含有相同数量的0和1,0变成-1之后,也就是,含有相同数量的-1和1,也就是我们需要再 [0 , i - 1] 这个区间里面寻找一个最短的前缀和等于 sum - 0。在处理二进制数组的时候,因为数组里面只有0和1,我们可以将所有的0变成-1。这个时候1和-1之间就可以产生很多抵消,有利于处理数组。处理的大体思路类似,依旧采用前缀和+哈希表来处理。分析到这里,相信读者可以联想到前面的一道题。在这道题目里面就是和为0的子数组。那么这个区间的和就是0。

2024-10-13 09:31:42 588

原创 算法:974.和可以被K整除的子数组

然后在[0,i-1]区间内去hash表中寻找一个区间的前缀和对k取模的结果与sum对k取模结果相同即可。将sum% k的余数放到hash表中(一定要是先查找在插入)(2)对于[0 , i]区间的和正好是K的倍数的情况如何处理。还是一样,我们先去把余数0提前先往hash表里插一个即可。按道理来说应该是3,但是C++/java里的答案是-2。OK,到这里前置知识讲完了,我们就正式开始讲思路了。那么只需要找两个区间的前缀和对k取模的余数相同即可。需要找一个子数组的和是k的倍数。记录sum % k的余数。

2024-10-12 11:00:30 457

原创 算法:560.和为k的子数组

这道题目也是要求我们求一段连续区间的和,我们的前缀和算法也能帮助我们做到 [l , r] = dp[r] - dp[l - 1]如果开前缀和数组的话,那也是需要遍历前缀和数组,以每一个下标为终点当sum去找sum - k,时间复杂度依旧是O(N。抽象来看,存在一个区间的和为k,那么在==[0 , i - 1]==就存在一个前缀和为sum - k。所以,我们求区间和为k,也就是,k = sum[r] - sum[l - 1]nums[i]可正可负,区间的和没有单调性,使用不了滑动窗口。这里带来新的解决方法。

2024-10-12 10:43:54 794

原创 算法:238.除自身以外数组的乘积

另外,这道题目对边界的情况处理不一样。而不能像前缀和和后缀和中一样处理成0。这道题目的区别在于,这道题是预处理。724. 寻找数组的中心下标。在前一篇博客讲解了该题目。

2024-10-08 22:55:13 506 1

原创 算法:724.寻找数组的中心下标

那么我们可以借助前缀和思想,将[left]区间和[right]区间的元素和求出来,就可以很好的方便比较。我们只需要[left]区间内的元素和等于[right]区间的元素和即可,此时mid就是中心下标。看到这里,读者们可能会问,通过前缀和算法为什么可以求出[right]区间的和呢?最后处理好前缀和数组和后缀和数组之后,只需要遍历比较前缀和数组和后缀和数组即可。当然,用整个数组的和减去[left]区间和mid元素可以得到答案,顾名思义,将前缀和反过来,我们从数组末尾向前求和就成了后缀和。什么是后缀和算法呢?

2024-10-08 22:47:52 299

原创 算法:前缀和算法模版

当我们需要求区间[l,r]的元素和的时候,就可以用dp[r] - dp[l - 1]我们先预处理出来一个dp数组,用来存放从[1,1]到[i,j]这个矩阵内的元素和。我们可以用递推的思想,前n个元素的和等于前n-1个元素的和加上第n个元素的和。我们可以预处理出一个dp数组,来存放[1,i]的区间的元素和。那么A+B+C+D = (A+B)+(A+C)- A + D。很容易想到的是,(A+B+C+D) - (A+B+C)来,我们抽象出来一个矩阵,从[1,1]到[i,j]诶嘿,来,试试小学几何题常用的割补法。

2024-10-08 22:18:34 927 1

原创 算法:LCR 173. 点名 (原:剑指 offer:0~n-1 中缺失的数字 )

求出每一个元素与前一个元素的差,然后哦遍历这个差,当发现差值不等于1的时候,就返回该位置的值即可。利用高斯求和公式求出0~n的和,然后减去nums数组中的每一个数,最后的结果就是缺失的数字。注意了,这是因为题目特殊,题目是有序的情况下,才能存在这种二段性,否则要先排序。将0~n的所有数字均与nums中的数字按位异或一下,最后的结果就是缺失的数字。我们可以发现,当有序的序列缺失了一个元素之后。在缺失元素之前的每一个元素都和下标相等,采用按位异或的操作,相同为0,不同为1。时间复杂度,O(N)

2024-09-30 22:17:54 600

原创 算法:153.寻找旋转排序数组中的最小值

while(left < right) //这里不能取等,不然死循环。题目要求O(logN)的时间复杂度,那就必然是使用二分算法了。题目要求返回最小元素,不是最小元素的下标。根据这一规则,二分不就来了嘛。很明显,是寻找左边界的二分。首先,我们来寻找二段性。

2024-09-30 21:35:31 435

原创 算法:852.山脉数组的峰顶索引

题目的提示已经非常明显了,使用O(logN)的算法,那就是二分算法。观察数据,可以发现,需要找的峰顶索引的左右两侧数据有不同的特征。根据此二段性,我们就可以设计出二分算法了。峰顶索引左边的数据都比前一个数据大。峰顶索引右边的数据都比前一个数据小。

2024-09-29 22:00:37 465

原创 数据结构:AVL树

/左子节点//右子节点//父亲节点//数据//平衡因子:_kv(kv){}注意:AVL树使用三叉链实现,多了一个parent指针,用来记录父亲节点,方便使用。

2024-09-29 21:51:54 1032 4

原创 算法:69.x的平方根

3、right - left + 1,因为这里出现了 + 1,所以可能超出int的范围,所以left就不从0开始,从1开始即可,对0进行特判即可。1、这里使用的是寻找右边界的二分算法,left < right , mid = left + (right - left + 1) / 2;2、target的范围是int,但mid * mid可能超出int的范围,需要把mid设置成long long类型。序列,我们可以发现分成两部分,一边 <= target,另一边大于 target,我们先用暴力查找找点灵感。

2024-09-24 22:02:42 407

原创 数据结构:搜索二叉树

在前面我们已经学习了二叉树的基础操作,但是,仅仅是二叉树,没有太大的作用啊,存数据效果没有顺序表和链表好,那为啥还要学二叉树呢?这不就来了嘛,给二叉树增加一些性质,作用不就出来了嘛。本篇文章将介绍二叉树的进阶版本,给二叉树增加了搜索特性,搜索二叉树。

2024-09-24 11:45:13 1164 2

原创 数据结构:二叉树OJ题(基础版)

更完两期二叉树的知识之后,来做几道oj题巩固一下基础。

2024-09-22 21:15:41 1111 2

原创 数据结构:二叉树(2)

普通的树的实用价值比较小,将树更一步特殊化成二叉树,将获得更多的特殊性质。例如搜索二叉树,红黑树等。这篇博文主要介绍二叉树的基础知识,进阶版高级二叉树,后续会持续更新。

2024-09-21 11:28:16 1323

原创 数据结构:二叉树(一)

ps:偷懒了几天,接着更新。

2024-09-21 10:31:40 1030

原创 算法:76.最小覆盖子串

问题来了,该题目需要大量使用hash表比较,这是时间复杂度很高的,并不是和好,怎么去优化呢?利用hash表统计窗口内的个字符出现的个数,与hash1进行比较。令t用的hash表为hash1,s用的hash表为hash2。而不要在过程中,每一次更新结果的时候都创建一个子串。这道题,最后要求我们返回的是子串,而不是下标,一定要设置一个begin和len来标记子串,还是老样子,连续问题,滑动窗口+哈希表。样例里面有内存特别大的极端样例。选取符合情况的最小子串即可。注意,这里有一点比较坑。详情见异位词的那道题。

2024-09-16 20:01:43 637 1

原创 算法:30.串联所有单词的子串

我们这么来看这道题目,我们把words数组里面的字符串都看成一个字母,那这个题目不就是让我们去在s字符串中去寻找words数组的异位词吗?在s中寻找的时候,可能bar一组,也可能arf一组,也可能rfo一组,情况非常多。注意:这道题目中words数组里面的字符串长度都是相同的,不妨令长度为len。当count==words.size(),此时的left即为有效下标。但是,不要忘记了,words数组里面的字符串长度是相同的,这道题目类似寻找异位词的题目,我认为是寻找异位词的升级版。出窗口前维护count。

2024-09-16 19:24:23 504 1

原创 算法:TopK问题

有10亿个数字,需要找出其中的前k大个数字。为了方便讲解,这里令k为5。

2024-09-15 19:12:48 739

原创 数据结构:堆排序

更完堆,再更一期堆排序。

2024-09-15 13:06:21 1271 1

原创 数据结构::堆

1.下列关键字序列为堆的是:()答案:A。

2024-09-14 21:25:40 1360 1

原创 一道迭代器失效练习题

首先学习迭代器失效学完迭代器失效之后做一道题呗。

2024-09-10 20:35:33 329

原创 438.找到字符串中所有字母异位词

注意,这里hash表里面仅仅存的是字符,总共26个小写字母,直接遍历一遍出结果就可以,还是很好比较的,但是,如果存的不是字符呢?出窗口前,发现hash2[left] == 2 > hash1[left],那么说明出的这个元素是无效元素,count不需要改变。开始 hash2[s[right]] 进入hash表后,1 <= hash1[c],那么这就是有效元素,count++下一次出窗口时,发现hash2[c] <= hash1[c],诶,就是有效元素了,count–这是再遍历hash去比较,比较的麻烦。

2024-09-10 18:39:28 1081

原创 102.二叉树的层序遍历

单纯层序遍历使用队列就可以了,每次出队列的时候,进行输出,并将该元素的left和right入队列即可。二叉树的单纯层序遍历还是很简单的,但是这个题,要求我们将返回值按层写到一个二维数组中,该如何实现呢?经过观察,可以发现,每一次删完一层的元素之后,队列里面剩余的元素个数就是下一层的元素个数。解决完关键问题之后就比较简单了,套上一般层序遍历的代码来写即可。我们可以设置一个变量来记录每一层的元素个数。再来一个queue存每一个元素的层数。在这个题目中,问题在于,

2024-09-09 20:08:36 309

原创 946.验证栈序列

我们知道一个栈的一种入栈顺序可能对应多种出栈顺序,让我们肉眼来判断一下,还是很容易判断出来是不是正确的出栈顺序,那么如何用代码来实现呢?pushed走完了之后,去查看s是否为空,如果s为空,说明匹配上了,否则,不匹配。先把pushed进一个栈s,然后比较s.top 与 popped[i],++i后再与s.top继续比较,直到不相等跳出循环。如果相等,就s.pop,同时++i;如果不相等,就继续将pushed入栈。OK,先掏一个栈s出来再说。

2024-09-09 19:52:31 307

原创 147.最小栈

mins.top一定是最小元素,所以s.top 不可能 < mins.top。其中一个栈s实现栈的基本功能,另一个栈mins实现检索最小元素的功能。在每一次入栈的时候,都将该元素x与mins栈的栈顶元素top相比较。注意这里要加上等号,因为,可能会有多个最小的元素,比如出现多个0等。这道题目做起来还是比较简单的,使用两个栈就可以实现题目要求。来看一下怎么样实现检索最小元素的功能呢?x入mins栈,此时x也就成了最小的元素。将s.top 与mins.top进行比较。也就是最小元素,此时两个栈同时pop。

2024-09-09 19:37:08 551

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除