![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++力扣算法题|代码随想录|学不会的天真boy
文章平均质量分 81
该专栏附有算法题的详细解答,希望可以帮助大家
学不会的天真boy
这个作者很懒,什么都没留下…
展开
-
C++力扣题目383--赎金信
这道题目和242有效的字母异位同相似,相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点。第一点“为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思” 这里。原创 2023-12-19 20:35:51 · 329 阅读 · 0 评论 -
C++力扣题目202--快乐数
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。判断sum是否重复出现就可以使用unordered_set。这道题目看上去貌似一道数学问题,其实并不是!编写一个算法来判断一个数。原创 2023-12-18 12:51:46 · 43 阅读 · 0 评论 -
C++力扣题目1--两数之和
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。思路:本题呢,需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,整数,并返回它们的数组下标。,请你在该数组中找出。原创 2023-12-19 19:10:26 · 366 阅读 · 0 评论 -
C++力扣题目203--移除链表元素
思路:本人使用的虚拟节点来移除链表元素,也可以直接针对题目给的原链表的头结点进行操作。链表移除元素就是将指针域的关系梳理清除。原创 2023-12-11 21:52:29 · 19 阅读 · 1 评论 -
C++力扣题目704--二分查找
思路1:左闭右闭,注意两侧均为闭,思考清楚循环时的条件及end初值,mid= (start +end)/2与目标值不等时,start和end应怎么移动。,如果目标值存在返回下标,否则返回。个元素有序的(升序)整型数组。力扣704--二分查找。原创 2023-12-10 11:29:42 · 351 阅读 · 0 评论 -
C++力扣题目15--三数之和
两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。思路:本题利用哈希表来做,是可以做的,但是本题要求不重复的三元组,如果仍然使用哈希表来做,时间复杂度为O(n^2),空间复杂度O(n),有额外的容器即内存开销,用哈希解法的话,原创 2023-12-20 12:40:23 · 320 阅读 · 0 评论 -
C++力扣题目24--两两交换链表中的节点
思路:正常模拟过程即可,按照下图中的三步来进行设计。原创 2023-12-14 16:35:45 · 70 阅读 · 1 评论 -
C++力扣题目 59--螺旋矩阵
思路:该题考察模拟循环过程,想清楚边界,坚持循环不变量原则,本人采用的是左闭右开,也可以左开右闭,根据自己定好的原则来设计。所有元素,且元素按顺时针顺序螺旋排列的。原创 2023-12-11 19:49:12 · 370 阅读 · 1 评论 -
C++力扣题目707--设计链表
思路:该题为链表的常见操作的设计,很考验基础,链表操作有两种方式,加虚拟头结点和不加虚拟头结点,本人使用的是加虚拟头结点的方式。代码书写时要注意表达句里的地址是否为空。原创 2023-12-13 08:47:15 · 53 阅读 · 1 评论 -
C++力扣题目977--有序数组的平方
因为数组有序,所以平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,start指向起始位置,end指向终止位置。组成的新数组,要求也按。思路:经典方法,双指针。原创 2023-12-10 17:45:30 · 314 阅读 · 1 评论 -
C++力扣题目 27--移除元素
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。原创 2023-12-10 12:21:51 · 411 阅读 · 1 评论 -
C++力扣面试题目02.07--链表相交
思路:简单来说,就是求两个链表交点节点的指针。 这里要注意,交点不是数值相等,而是指针相等。原创 2023-12-15 13:17:28 · 18 阅读 · 0 评论 -
C++力扣题目19--删除链表的倒数第N个结点
思路:双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。原创 2023-12-14 17:34:36 · 94 阅读 · 1 评论 -
C++力扣题目206--反转链表
其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。原创 2023-12-13 21:37:15 · 398 阅读 · 1 评论 -
C++力扣题目349--两个数组的交集
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。那么用数组来做哈希表也是不错的选择,但是要注意,[4,9] 也是可通过的。原创 2023-12-18 10:40:51 · 21 阅读 · 0 评论 -
C++力扣题目209--长度最小的子数组
思路:经典双指针法,形成一个滑动窗口,来判断出长度最小的子数组。原创 2023-12-10 17:51:11 · 53 阅读 · 1 评论 -
C++力扣题目242--有效的字母异位同
思路:暴力解法运用双重循环,就不多说了,这里题目提示了小写字母,并且字母是异位的,所以只能从字母的个数即在字符串中出现的次数出发,来判断两个字符串是否异位同。核心就是创建新数组记录其中一个字符串的字母个数,然后再和另一个字符串的字母进行对比。中每个字符出现的次数都相同,则称。,编写一个函数来判断。原创 2023-12-18 10:01:51 · 25 阅读 · 0 评论 -
C++力扣题目454--四数相加II
思路:四个数相加,可以拆分成1个和3个相加或者2,2相加,但3个相加具体实现时就回出现三层循环,时间复杂度过大,因此使用2,2相加,步骤就是创建一个哈希表,key用来存放两个数组内元素相加的结果,value记录两个数组内元素相加结果出现的次数,然后利用哈希表的特点,对另两个数组内元素的和的相反数进行查找,若找到,计数加上该结果的出现的次数即value。,请你计算有多少个元组。原创 2023-12-19 20:16:48 · 417 阅读 · 0 评论 -
C++力扣题目142--环形链表II
给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(如果pos是-1,则在该链表中没有环。pos,仅仅是为了标识链表的实际情况。链表。返回索引为 1 的链表节点链表中有一个环,其尾部连接到第二个节点。返回索引为 0 的链表节点链表中有一个环,其尾部连接到第一个节点。返回 null链表中没有环。原创 2023-12-15 14:17:00 · 25 阅读 · 0 评论 -
C++力扣题目541--反转字符串II
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。这道题目其实也是模拟,实现题目中规定的反转规则就可以了。,从字符串开头算起,每计数至。原创 2023-12-21 09:39:40 · 404 阅读 · 0 评论 -
C++力扣题目20--有效的括号
但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。首先要弄清楚,字符串里的括号不匹配有几种情况。原创 2023-12-25 10:16:56 · 422 阅读 · 0 评论 -
C++力扣题目28--找出字符串中第一个匹配项的下标
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。原创 2023-12-23 10:31:03 · 796 阅读 · 0 评论 -
C++力扣题目347--前k个高频元素
寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)原创 2023-12-27 14:05:49 · 962 阅读 · 0 评论 -
C++力扣题目--94,144,145二叉树非递归(迭代)遍历
此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!上面这句话,可能一些同学不太理解,建议自己亲手用迭代法,先写出来前序,再试试能不能写出中序,就能理解了。原创 2024-01-08 22:13:57 · 961 阅读 · 0 评论 -
C++力扣题目225--用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(、、 和 )。实现 类:注意:示例:输入:["MyStack", "push", "push", "top", "pop", "empty"][[], [1], [2], [], [], []]输出:[null, null, null, 2, 2, false]解释:MyStack myStack = new MyStack();myStack.push(1);myStack.push(2);myStac原创 2023-12-24 20:28:14 · 940 阅读 · 0 评论 -
C++力扣题目--94,144,145二叉树统一迭代遍历
此时我们写出了统一风格的迭代法,不用在纠结于前序写出来了,中序写不出来的情况了。但是统一风格的迭代法并不好理解,而且想在面试直接写出来还有难度的。所以大家根据自己的个人喜好,对于二叉树的前中后序遍历,选择一种自己容易理解的递归和迭代法。原创 2024-01-09 13:46:50 · 449 阅读 · 0 评论 -
C++力扣题目150--逆波兰表达式求值
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后序遍历的方式把二叉树序列化了,就可以了。在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么。该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。大家可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树。是差不错的,只不过本题不要相邻元素做消除了,而是做运算!这一点我们在后续讲解二叉树的时候,会更详细的讲解到。原创 2023-12-25 14:38:06 · 981 阅读 · 0 评论 -
C++力扣题目--94,144,145二叉树递归遍历
这里帮助大家确定下来递归算法的三个要素。原创 2024-01-08 22:12:20 · 489 阅读 · 0 评论 -
C++力扣题目239--滑动窗口最大值
每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。原创 2023-12-25 15:36:19 · 906 阅读 · 0 评论 -
C++卡码网题目55--右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。原创 2023-12-22 14:30:22 · 535 阅读 · 0 评论 -
C++力扣题目232--用栈实现队列
在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,可以思考一下如何把代码抽象一下。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈。,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。在push数据的时候,只要数据放进输入栈就好,,这里要注意输入栈和输出栈的关系。最后如何判断队列为空呢?原创 2023-12-24 20:01:18 · 410 阅读 · 0 评论 -
C++卡码网题目54--替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。原创 2023-12-21 12:01:36 · 353 阅读 · 0 评论 -
C++力扣题目1047--删除字符串中的所有相邻重复项
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。原创 2023-12-25 10:54:22 · 509 阅读 · 0 评论 -
C++力扣题目226--翻转二叉树
针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。这也是造成了二叉树的题目“一看就会,一写就废”的原因。针对翻转二叉树,我给出了一种递归,三种迭代(两种模拟深度优先遍历,一种层序遍历)的写法,都是之前我们讲过的写法,融汇贯通一下而已。大家一定也有自己的解法,但一定要成方法论,这样才能通用,才能举一反三!原创 2024-01-10 11:27:13 · 1096 阅读 · 0 评论 -
C++力扣题目459--重复的字符串
给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。s = "abab"true可由子串 "ab" 重复两次构成。s = "aba"falsetrue可由子串 "abc" 重复四次构成。(或子串 "abcabc" 重复两次构成。原创 2023-12-23 10:27:57 · 1952 阅读 · 0 评论 -
C++力扣题目151--反转字符串中单词
一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。的逻辑是一样的,本题是移除空格,27题是移除指定元素,本质是一样的。原创 2023-12-21 12:36:25 · 459 阅读 · 0 评论 -
C++力扣题目344--反转字符串
的方法一致,由于本题是字符串反转,使用双指针比链表更简单,因为字符换是一种数组,元素在内存中连续分布,对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。原创 2023-12-21 09:05:12 · 379 阅读 · 0 评论 -
C++力扣题目18--四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。对于三数之和双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。就返回了,三数之和 可以通过。原创 2023-12-20 14:01:39 · 341 阅读 · 0 评论 -
C++力扣题目-- 二叉树层序遍历
102思路:接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,使用队列实现二叉树广度优先遍历,动画如下:这样就实现了层序从左到右遍历二叉树。。107--将102的结果reverse即可;199--二叉树的右视图层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。637--二叉树的层平均值。原创 2024-01-09 20:43:47 · 883 阅读 · 0 评论 -
C++力扣题目617--合并二叉树
合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。这不是我们第一次操作两棵二叉树了,在二叉树:我对称么?中也一起操作了两棵二叉树。迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。最后拓展中,我给了一个操作指针的野路子,大家随便看看就行了,如果学习C++的话,可以再去研究研究。原创 2024-01-13 11:37:40 · 928 阅读 · 0 评论