算法刷题
文章平均质量分 82
算法刷题
一个双鱼座的测开
意气风发的少年
创作不易,内容有帮助的话可以点关注后续持续更新工作中遇到问题及总结。
展开
-
二叉树相关算法需了解汇总-基础算法操作
【代码】二叉树相关算法需了解汇总-基础算法操作。原创 2024-02-18 22:37:32 · 542 阅读 · 0 评论 -
算法刷题-大数加法
输入: “1”,“99” 复制 返回值: “100” 复制 说明: 1+99=100。以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。输入: “114514”,“” 复制 返回值: “114514”原创 2023-11-26 14:42:34 · 537 阅读 · 0 评论 -
有效的括号
数据结构与算法应用往往隐藏在我们看不到的地方。原创 2023-06-18 09:26:48 · 642 阅读 · 0 评论 -
用队列实现栈
C++优化代码。原创 2023-06-18 09:25:29 · 202 阅读 · 0 评论 -
用栈实现队列
工作上一定没人这么搞,但是考察对栈、队列理解程度的好题。原创 2023-06-18 09:21:09 · 490 阅读 · 0 评论 -
四数之和之双指针解题思路
一样的道理,能解决四数之和那么五数之和、六数之和、N数之和呢?原创 2023-06-18 09:19:30 · 1085 阅读 · 0 评论 -
三数之和之双指针解题思路
用哈希表解决了,那么三数之和呢?原创 2023-06-18 09:19:38 · 711 阅读 · 0 评论 -
双指针-链表相交
同:160.链表相交给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构。原创 2023-06-18 09:16:04 · 408 阅读 · 0 评论 -
删除链表的倒数第N个节点
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?思路是这样的,但要注意一些细节。输出:[1,2,3,5]原创 2023-06-18 09:14:26 · 1067 阅读 · 0 评论 -
算法刷题-双指针-二分法
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。很多同学这道题目做的很懵,就是不理解 快慢指针究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。给定 nums = [0,1,2,2,3,0,4,2], val = 2,元素的顺序可以改变。原创 2023-06-17 22:39:41 · 1416 阅读 · 0 评论 -
实现 strStr
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。原创 2023-06-17 22:31:57 · 425 阅读 · 0 评论 -
算法刷题-字符串-左旋转字符串
此时我们已经反转好多次字符串了,来一起回顾一下吧。在这篇文章344.反转字符串,第一次讲到反转一个字符串应该怎么做,使用了双指针法。然后发现541. 反转字符串II,这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。后来在151.翻转字符串里的单词中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。最后再讲到本题,本题则是先局部反转再 整体反转,与151.翻转字符串里的单词类似,但是也是一种新的思路。原创 2023-06-17 22:28:42 · 1338 阅读 · 0 评论 -
算法刷题-字符串-翻转字符串里的单词
综合考察字符串操作的好题。原创 2023-06-17 22:28:51 · 1087 阅读 · 0 评论 -
算法刷题-字符串-替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”原创 2023-06-17 22:26:59 · 550 阅读 · 0 评论 -
算法刷题-字符串-反转字符串II
简单的反转还不够,我要花式反转。原创 2023-06-17 22:23:13 · 1104 阅读 · 0 评论 -
算法刷题-字符串-反转字符串
打基础的时候,不要太迷恋于库函数。原创 2023-06-17 22:21:20 · 1098 阅读 · 0 评论 -
算法刷题-哈希表-四数之和
一样的道理,能解决四数之和那么五数之和、六数之和、N数之和呢?原创 2023-06-17 22:19:40 · 1321 阅读 · 0 评论 -
算法刷题-哈希表-三数之和
用哈希表解决了,那么三数之和呢?原创 2023-06-17 22:16:48 · 728 阅读 · 0 评论 -
算法刷题-哈希表-赎金信
在哈希法中有一些场景就是为数组量身定做的。原创 2023-06-11 14:16:22 · 818 阅读 · 0 评论 -
算法刷题-哈希表-四数相加
需要哈希的地方都能找到map的身影。原创 2023-06-11 14:14:43 · 1154 阅读 · 0 评论 -
算法刷题-哈希表-两数之和
为什么会想到用哈希表哈希表为什么用map本题map是用来存什么的map中的key和value用来存什么的把这四点想清楚了,本题才算是理解透彻了。很多录友把这道题目 通过了,但都没想清楚map是用来做什么的,以至于对代码的理解其实是 一知半解的。原创 2023-06-11 14:13:01 · 1122 阅读 · 0 评论 -
算法刷题-哈希表-快乐数
该用set的时候,还是得用set。原创 2023-06-11 14:09:19 · 1104 阅读 · 0 评论 -
算法刷题-哈希表-两个数组的交集
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。那么用数组来做哈希表也是不错的选择,例如。原创 2023-06-11 14:09:30 · 496 阅读 · 0 评论 -
算法刷题-哈希表-查找常用字符
给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。然后hash 和 hashOtherStr 取最小值,这是本题关键所在,此时取最小值,就是 一个字符在所有字符串里出现的最小次数了。这道题意一起就有点绕,不是那么容易懂,其实就是26个小写字符中有字符 在所有字符串里都出现的话,就输出,重复的也算。可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。原创 2023-06-11 14:06:00 · 485 阅读 · 0 评论 -
算法刷题-哈希表-有效的字母异位词
需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。数组就是简单的哈希表,但是数组的大小可不是无限开辟的。原创 2023-06-11 14:05:51 · 737 阅读 · 0 评论 -
算法刷题-了解哈希表
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!原创 2023-06-11 14:03:07 · 758 阅读 · 0 评论 -
算法刷题-链表-链表相交
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。这里同学们要注意,交点不是数值相等,而是指针相等。为了方便举例,假设节点元素数值相等,则节点指针相等。注意,函数返回结果后,链表必须 保持其原始结构。简单来说,就是求两个链表交点节点的。否则循环退出返回空指针。同:160.链表相交。原创 2023-06-11 13:56:13 · 878 阅读 · 0 评论 -
算法刷题-链表-环形链表
这次可以说把环形链表这道题目的各个细节,完完整整的证明了一遍,说这是全网最详细讲解不为过吧,哈哈。原创 2023-06-11 13:56:36 · 853 阅读 · 0 评论 -
算法刷题-链表-移除链表元素
链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点再进行删除操作,接下来看一看哪种方式更方便。原创 2023-06-10 16:13:07 · 1002 阅读 · 0 评论 -
算法刷题-数组-长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。原创 2023-06-10 16:00:43 · 357 阅读 · 0 评论 -
算法刷题-链表-设计链表
听说这道题目把链表常见的五个操作都覆盖了?原创 2023-06-10 16:16:37 · 882 阅读 · 0 评论 -
算法刷题-数组-螺旋矩阵
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。中讲解了二分法,提到如果要写出正确的二分法一定要坚持。原创 2023-06-10 16:05:40 · 1233 阅读 · 0 评论 -
算法刷题-链表-反转链表
反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。原创 2023-06-10 16:22:50 · 1367 阅读 · 0 评论 -
算法刷题-数组-移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。很多同学这道题目做的很懵,就是不理解 快慢指针究竟都是什么含义,所以一定要明确含义,后面的思路就更容易理解了。函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。给定 nums = [0,1,2,2,3,0,4,2], val = 2,元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。给定 nums = [3,2,2,3], val = 3,原创 2023-06-10 15:31:24 · 1514 阅读 · 0 评论 -
算法刷题-数组-有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]原创 2023-06-10 15:37:19 · 1354 阅读 · 0 评论 -
算法刷题-关于链表,你该了解这些!
接下来说一说链表的定义。链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。而在面试的时候,一旦要自己手写链表,就写的错漏百出。// 单链表 struct ListNode {int val;// 节点上存储的元素 ListNode * next;// 指向下一个节点的指针 ListNode(int x) : val(x) , next(NULL) {原创 2023-06-10 16:11:11 · 233 阅读 · 0 评论 -
算法刷题-链表-两两交换链表中的节点
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。对应的C++代码实现如下: (注释中详细和如上图中的三步做对应)你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。对虚拟头结点的操作,还不熟悉的话,可以看这篇。接下来就是交换相邻两个元素了,这道题目正常模拟就可以了。原创 2023-06-10 16:27:43 · 688 阅读 · 0 评论 -
算法刷题-链表-删除链表的倒数第N个节点
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?思路是这样的,但要注意一些细节。输出:[1,2,3,5]原创 2023-06-10 16:28:17 · 856 阅读 · 0 评论 -
LeetCode 刷题攻略
LeetCode 刷题攻略数组数组:704.二分查找原创 2023-06-06 22:49:51 · 206 阅读 · 0 评论 -
算法刷题-数组-二分查找
二分法是非常重要的基础算法,为什么很多同学对于二分法都是一看就会,一写就废?其实主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。本篇根据两种常见的区间定义,给出了两种二分法的写法,每一个边界为什么这么处理,都根据区间的定义做了详细介绍。相信看完本篇应该对二分法有更深刻的理解了。原创 2023-06-06 22:42:52 · 414 阅读 · 0 评论