- 博客(76)
- 收藏
- 关注
原创 二叉排序树
考察二叉搜索树的插入,例如有2 3 5 现有插入4,需要插入到3,5之间,然后3,5又有可能是3在5上或者5在3上。4总是插入在层次更深的节点下边,所以我们需要开一个map存储层数,顺便由于map是有序的所以插入的时候可以用二分查找到插到哪个数下。
2025-03-22 13:16:58
126
原创 二叉树遍历
同样,本题是给出二叉树的前序遍历和中序遍历求后序遍历,本题由于直接给的就是字符串,所以比给节点值的会好很多,因为不需要哈希表了,string自带了find函数。求后序和求前序本质就是一样的,区别在于输出/更新是在递归之前还是递归之后。
2025-03-22 13:13:25
116
原创 前序遍历~
经典的二叉树遍历,由中序和后序遍历构造出二叉树从而找出前序遍历,但是这种题一般不需要建树,可以直接找到。我们知道后序遍历的最后一个结点就是树的根节点,而根节点在中序遍历中将左右子树分割。利用这一特性我们就可以重建树,而前序遍历是先根后左右。由于题目要输出前序遍历的最后一个数字,所以需要每次递归都进行更新。
2025-03-22 13:10:32
216
原创 根能抵达的点
check如何写呢,check本质就是判断根节点到节点的数目是否不超过Y。本题关键就在代码的实现和二分的思维。本题要求找一个最小的非负整数x,这个x实际就是边权,这里想到二分边权的简直就是天才。我们二分边权然后check一下是否满足条件。
2025-03-16 19:52:28
124
原创 判断素数~
由于n最大只有10000,其实埃氏筛和普通筛都行,但是线性筛最好是背过,所以线性筛后有一个素数数组,由于数组是单调增的所以查找的话可以用二分查找,所以总的时间复杂度是O(n)的非常轻松。这里我们的二分查找应该是查找>=x的第一个数,所以采用lower_bound()
2025-03-15 13:31:05
106
原创 链表合并(数组做法)
拿到题目,两个升序链表要求合并,第一时间想到了归并排序的二路归并,简直是天生为了这个设计的题目。我们没必要管链表,就用数组存也是可以的。二路归并,定义两个指针分别指向两个数组的头部,比较大小,将小的存入新数组,直至一个数组遍历完,后面数组接上就好了。
2025-03-15 13:02:04
111
原创 删除字符串
本质就是模拟,删除含有gzu的子串,由于不区分大小写,所以默认将所有的gzu转换成小写进行判断。由于字符串长度不超过100,所以直接遍历就好了,每次取出长度为3的子串进行判断,如果符合的话就跳过,如果不是gzu的话就输出当前遍历到的字符。
2025-03-15 12:59:35
240
原创 围圈报数~
经典的约瑟夫环问题,定义一个队列就可以解决了,由于每次输出的都是报3的人,所以前面两个人先出队,后重新入队,第三个人就出队报数就好了,以此往复,直至队列为空。
2025-03-15 12:56:21
201
原创 安全密码(模拟)
条件有四个,大小字母,数字,以及其他,关于大小写字母和数字我们其实是有一个判断函数的不需要自己再去实现了,判断大写字母是 isupper()函数,小写字母是islower(),数字是isdigit(),还有一个函数是判断是否是字母的就是没有分的那么细 isalpha()纯模拟题,以及考察对于字符串的处理,有实现的细节需要注意,以及记住几个常用的函数方便写代码。首先可以先判断密码的长度如果<8了直接continue了,其次才是判断是否满足条件。
2025-03-15 12:54:16
171
原创 惠民工程(最小生成树)
求最小生成树有两种做法一个是kruskal算法,开始一个是prim算法,本题采用kruskal算法,算法的核心需要采用并查集。初始化时,每一个点都是在各自的集合中,首先将所有的边权从小到大排序,每次选中一条边,如果这条边的两个点不在一个集合中,就给他们加入同一个集合,并且将ans加上这条边权,遍历完所有的边就是答案了。本质也算是一种贪心做法。
2025-03-15 12:50:08
203
原创 好坑的电子地图(最短路问题)
本质就是求起点到终点的最短路问题,图论中的最短路一般有两种情况,一种是带负权边的,一种是非负权边的问题,本题显然是非负权边的问题,但是他在以往的基础上还多给了条件,就是出发的时候需要看地图,且奇数和偶数看的时间不一样,这里我们其实可以把多出来的时间直接算到边权里边就好了,在输入的时候处理一下,用dijkstra做就好了。本题采用邻接表存储图,注意这里是无向图。
2025-03-15 12:44:36
135
原创 数字~~~~(枚举题)
第一个想法就是遍历一下字符串给每一个出现的字符进行++操作,现在问题就是拿什么数据结构操作,如果只是用数组的话,查找的话还要o(n)就比较慢了,所以这里选择用哈希表存储,这样也能在边遍历字符串的时候,记录答案。题意非常的简单,给字符串,统计字符串中出现最多的字符,且这个字符串比较特殊是0~9组成的。
2025-03-15 12:26:18
179
原创 二进制数(去前导0版本)
本题值得注意的点:unsigned int 以及除去前导0,我们先讨论有前导0的写法,有前导0本质就是将int的32位遍历一遍找出一个位是什么,去掉前导0的话就是找到最后一个1,其实是一个while每次右移一位直到为0 即可,本题还有一个坑,就是输入可能为0,但是0进不了while循环,所以需要特判一下。以及我们用字符串存储答案,但是字符串存储的是反着的,所以需要reverse一下字符串。
2025-03-15 11:55:32
201
原创 哈夫曼树~
本题给我们n个节点要我们求其构成的哈夫曼树的带权路径长度,这个一般有两种求法,书面上的。求每个叶子节点的路径长度✖权值并且相加,或者将每一个非叶子节点的权值相加即为答案。由于哈夫曼树是每次合并最小的两个节点,所以我们需要用到一个数据结构——堆。每次将取出堆顶的两个元素,并且合并,合并后可以将它理解为一个新节点,直至堆中只有最后一个节点。每次合并出的一个节点必是非叶子节点所以我们定义一个ans每次加上即可。代码实现第二种的更为方便,因为第一种需要求路径长度。
2025-03-15 11:49:04
150
原创 加油站~~
求最少加油次数就是一个贪心问题,这里也不需要证明,根据我们的常识也知道就是走到油不够的时候就加油就好了,这里的no solution这有在两个加油站之间的距离大于了加满油后的行驶距离才会存在,其他情况都是可以计算的。代码有很多细节需要注意下。
2025-03-14 18:11:14
237
原创 巨人排队~
题目的意思就是排队要按照高到低排,但是小朋友开始排队的顺序是固定的,且排好就不动了,问最少要多少个队才能满足这样的要求。仔细想想就是贪心问题,其实也是一个常识问题,排队的人找到所有队列中大于等于他身高的最接近的那个队列。这样排队的话,我们只需要开一个数组,存储每个队列目前最后的人的身高。最后数组的长度就是最少的队伍数量,最重要的一点就是这个数组他是单调增的,因为要开第二个队的原理是第一个队的最后一位比当前要排的人矮。所以我们可以采用二分查找优化所以总的时间复杂度就是nlogn可以过。
2025-03-14 17:54:15
150
原创 走路还是坐公交
由于走路和坐公交所需要的时间都是1分钟,这个1分钟可以看作从x到x+1这种的权值,所以它们的权值是相同的,所以可以采用bfs找最短距离。
2025-03-14 17:00:58
153
原创 中南a+b问题
本质是字符串处理问题,这里我们需要搞清楚cin与getline的区别,cin碰到空格和回车都会结束读取,而getline只有碰到回车的时候会结束读取,所以一般我们在读取有空格的字符串时采用getline。本题不一样,本题仔细观察,数字的英文都被空格所隔开了,所以我们正好利用cin的这个特性将两个加数取出。
2025-03-14 16:56:52
195
原创 平方朋友对
从A找B会超时,因为A的范围是10的6次方,但是看B的范围要开根号,B最大应该是(maxA+n-1)*1000+999开根号范围在300000左右,所以我们从B开始找A,那么还得看看B的最小是多少,因为一定要在A的末尾添三个数字且A>=1所以A最小是1000那么其对应的B就应该是根号1000推出B应该是>=32,因为32的平方就是2的十次方也就是1024。
2025-03-10 16:27:10
149
原创 寻找重复数
这题真是一个很好的二分题目,打破了往常的思维,二分不是二分数组的下标,而是二分1~n的取值范围。好比mid=1+n>>1,如果数值范围1~mid中没有重复的数那么小于等于mid的数最多有mid个,如果大于了mid说明1~mid中有重复的数。
2025-03-04 14:59:40
124
原创 多数元素~
出现次数大于n/2说明这个数是最多的,遍历整个数组,用一个cnt记录一下当前出现最多的数。用哈希表存储每个数的出现次数,每次进行更新。
2025-03-04 14:28:41
150
原创 最小覆盖子串
需要理解涵盖这样操作如何判别,还是一样用两个数组,一个数组存t串的所有字符,另一个数组用来双指针遍历s判断涵盖否。遍历的过程中更新最小的涵盖长度。
2025-03-04 14:22:05
151
原创 滑动窗口的最大值
单调队列的常见问题,假设有一个窗口大小为3,求其中的最大值,先将数组的前三个数存入队列,找最大值需要o(k),再挪动再找,找完需要o(nk)的复杂度若k是n/2那么复杂度还是会达到o(n2)。想想如何优化,用队列,第一个数进入,进入第二个数的时候如果第二个数比第一个数大的话,第一个数是不是就没有用了,因为后面的最大值也不会是第一个,第一个窗口的最大值也不会是第一个数,所以我们直接将第一个数出队。这样每次移动的时候判断队列中的第一个数就是窗口的最大值。
2025-03-04 14:14:18
123
原创 和为k的子数组
看到子数组再看到求和,就应该很清晰的想到前缀和。前缀和是处理该问题的一种非常有效的手段。求解子数组之和等于S[r]-S[l]==k,本质和求两数之和的做法是一样的,用哈希表存储前缀和数组。
2025-03-04 14:04:49
154
原创 找到字符串中所有的字母异位词
异位词即子串的所有排列,本质就是里面的字母都一样,本题是定长滑动窗口问题,窗口大小就是p串的长度,每次判断窗口中的子串是否符合p串的异位词。用两个int数组存储各是什么字符,即26个字母用ascii🐎。
2025-03-04 13:59:50
176
原创 无重复字符的最长子串
可以用滑动窗口在做,每次向前滑动,窗口里不含有重复的字符,窗口的最大值就是子串的最大长度。需要用unordered_set<char>来存储窗口中的字符。
2025-03-04 13:53:29
175
原创 接雨水~~
这题要找到切入点,找每一根柱子能接到多少水,求总和就好。一根柱子能接到多少看他的左边最大和右边最大,哪个更小,减去柱子高度就好了,所以预处理好两个数组。
2025-03-04 13:49:30
120
原创 盛水最多的容器
题意就是找到面积最大的一块,暴力还是同样的o(n2)但是n取到了1e5,所以暴力会超时,考虑双指针算法,这里的双指针需要找到性质。如图所示两根红色的柱子,较小的是右边的,无论左边的柱子换成多高都不会超过现在的面积,有点类似木桶效应。所以我们需要移动较小的柱子才可能找到更大的面积,双指针分别指向两边,每次移动更矮的柱子直到指针相遇即可。
2025-03-04 12:13:20
146
原创 移动00000
想能否进行优化,例如数组为0,0,1,2,3需要调整为1,2,3,0,0,可以将0看作空位置,只需要将第一个0和1互换变成1,0,0,2,3此时再将第一个0与2互换即可,所以由这个规律可以用双指针算法,左指针记录第一个0所在的位置右指针指向非0数。冒泡排序的复杂度是o(n2)的所以偏暴力,但是也能过。代码很简洁,i0表示最左边的0初始值为0,可以自己模拟一下,若是前面的数不是0,则左右指针相同且同时移动,所以这个swap等于是没有互换,若碰到了0,左指针不动,右指针+1,互换即可。
2025-03-04 12:07:26
113
原创 最长连续序列
题意是求数组中的数,最长连续能是多少,例如有1,2,3,4,5这些数在数组中不要求连续,只需要存在即可。题目要求用o(n)的复杂度解决。本质就是查找x以及x+1这样下去的数是否存在于nums中,将查找做到o(1)即可。所以将nums中所有的数都先存入哈希集合中。别忘记在循环中不断更新最大值。
2025-03-04 11:58:06
202
原创 字母分组~
说白了就是把字母一样的分到一组,他们的顺序不一样。问题来了如何找到字母都一样的串呢,很巧妙的一点就是将他们按照字典序排序,如果字母一样的话,他们排序之后就是相同的,就可以加入一组了。还是遍历一遍vector就可以得到结果,复杂度是on的。这里需要将排序后一样的装入同一组,所以还是用哈希表这样定义vector<string,vector<string>>m,将排序后的串为key,value就是字符串数组。本题关键在于想到给字符串排序后他们是相同的。
2025-03-04 11:45:46
198
原创 两数之和~
leetcode上热题100中的首题,首先先想暴力做法如何做,正常是两重循环找到target,这样就是o n方的复杂度,过高了。两数之和,写作x+y=target,能不能做到on呢,转换一下思路,其实target是知道的所以x=target-y。如果我们遍历一遍数组y去找x不就好了。但是需要在o1的时间找到x,就想到了哈希表。这里不需要提前将数组都加入哈希表中,只用在遍历的时候加入。
2025-03-04 11:40:17
197
原创 回文重新排序
回文串就两种情况,一种是有一个奇数个的字母,另一种是没有的。所以我们需要统计出题目给出的字母是否为奇数个,且奇数个只能有一个,如果超过一个就不能构成回文串了。
2025-02-28 21:56:20
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人