![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 52
佰无一用是书生
这个作者很懒,什么都没留下…
展开
-
二刷LeetCode--48. 旋转图像(C++版本),数学题
思路:主要是观察变化之后的数组和最开始的数组的区别,不难发现,先转置在左右镜像对称即可。需要注意的是转置和镜像对称中for变量的终止条件。原创 2023-08-17 22:18:35 · 401 阅读 · 0 评论 -
二刷LeetCode--46. 全排列(C++版本),回溯
思路:本题是典型的回溯问题,需要列举出每个排列,因此使用回溯法,对每个使用过的元素进行标记,因此需要一个和Nums同样大的标记数组,每个元素被使用之后在递归之前将其标记为已使用,在递归的时候该元素就不会参与统计,同理,在回溯递归回退的时候,需要对当前的元素的标记位置改回false,以便下一次遍历使用。原创 2023-08-17 17:30:50 · 376 阅读 · 0 评论 -
二刷LeetCode--148. 排序链表(C++版本),必会题,思维题
思路,本题其实考察了两个点:合并链表、链表切分。首先从1开始,将链表切成一段一段,因为需要使用归并,所以下一次的切分长度应该是当前切分长度的二倍,每次切分,我们拿出两段,然后将第三段的开头赋值给一个指针,合并前面两段,下一次继续从第三段开始切分,然后继续合并。原创 2023-08-16 17:55:56 · 361 阅读 · 0 评论 -
二刷LeetCode--11. 盛最多水的容器(C++版本),基本题
思路:因为容器的储水量由较低的那个板子负责,因此每次我们需要移动的就是那个较低的板子,每次移动之后需要判断当前的储水量和最大的储水量谁大,将较大的赋值给最终结果.原创 2023-08-15 09:57:29 · 66 阅读 · 0 评论 -
二刷LeetCode--155. 最小栈(C++版本),思维题
思路:本题需要使用两个栈,一个就是正常栈,执行出入操作,另一个栈只负责将对应的最小值进行保存即可.每次入栈的时候,最小值栈的栈顶也需要入栈元素,不过这个元素是最小值,那么就需要进行比较,因此在getmin()的时候只需要将最小值栈的栈顶元素弹出即可.初始化的时候只需要将最小值栈的元素用最大值(INT_MAX)进行初始化.原创 2023-08-14 15:14:28 · 386 阅读 · 0 评论 -
二刷LeetCode--146.LRU缓存(C++版本),必会题目
本题思路:因为需要记录元素的出入顺序,并且每次访问之后需要将该节点提到最前面,因此需要使用双向链表(单链表不方便删除操作),而为了可以在常量时间复杂度内找到对应的元素,我们需要使用哈希表,将每一个插入的元素在哈希表中进行记录.哈希表的key就是插入的key,而哈希表的value应该对应的是双向链表的一个节点.原创 2023-08-14 14:42:55 · 102 阅读 · 0 评论 -
二刷LeetCode--38. 外观数列(C++版本)思维题
本题一个思路是使用递归,从n开始向前进行递归,每一次计算n-1的表达形式,一直递归下去就可以得到第n个的表达式。也可以从前面开始向后计算,从第二个开始,因为第一个就是自己,对于每一个数,计算当前对应的序列,那么就再需要一个循环计算当前序列对应的下一个序列的形式了,而且也需要一个变量记录当前序列中重复的元素,因此我们定义一个计数器,注意,原创 2023-06-26 17:47:24 · 229 阅读 · 0 评论 -
二刷LeetCode--36. 有效的数独(C++版本)
单纯的行和列的判断较为简单,对于每一个元素如果是数字的话就将其对应的数组下标的元素变为1(是特殊符号的话就继续读取下一个元素),对于之后的数字,就会将其与0进行对比,如果其不为0的话,那么这个元素一定出现过了,则可以直接退出。对于小方块可以发现,一个9 * 9的矩阵里面有3 * 3个小矩阵,因此我们可以使用四个for循环进行小方块的遍历,原创 2023-06-25 21:40:56 · 145 阅读 · 0 评论 -
二刷LeetCode--34. 在排序数组中查找元素的第一个和最后一个位置(C++版本)基本二分即可
本题的思路在于,找到第一个重复元素的位置并不难,但是怎么找最后一个位置呢,小编想法是找比目标值大的元素,大一个即可,不论原数组中是否存在比目标值大一个的元素,因为二分里面查找是按照中间位置的元素大小与目标值元素大小进行的,因此如果查找比目标值大一的元素,最终就会找到目标值右边一个的位置,然后我们只需要将该位置减一即可。二分法中每次返回的都是待查找元素最左边的下标。原创 2023-06-25 09:58:33 · 61 阅读 · 0 评论 -
二刷LeetCode--33. 搜索旋转排序数组(C++版本)有趣的变样式二分查找
本题因为题目对原始的递增数组进行了部分旋转,因此普通的二分就不能用了,所以相比于普通的二分,这里的二分则是需要进行第一个元素与中间元素的大小对比,来判断前半部分还是后半部分是有序的,因为,判断完有序之后,就可以在有序的部分中继续判断目标值是否存在于当前区间,如果不在当前有序区间的话,就需要对左右指针进行重新计算,然后继续进行二分判断。原创 2023-06-24 21:13:50 · 98 阅读 · 0 评论 -
二刷LeetCode--29. 两数相除(C++版本)核心较复杂
本题主要影响速度的地方就是while循环,如果我们使用传统的方式一次增加一个的话,时间复杂度是O(n),那么在数字比较极端的时候会导致超时情况的出现,因此就有了下图的优化情况。每次尝试减去除数的倍数,在减到导致被除数为负数的时候退出,更新被除数,然后将减去了多少个除数的计数器结果加入到最终结果中。下一轮继续这种减法,然后循环,直到被除数小于除数。本题首先容易想到的就是不断的使除数自增,通过计数器判断增加了多少次, 那么增加的次数就是想要的答案。原创 2023-06-20 20:56:35 · 96 阅读 · 0 评论 -
二刷LeetCode--28. 找出字符串中第一个匹配项的下标(C++版本)KMP算法例题
本题是标准的KMP算法考察问题,奈何小编功力不够,当下只用find函数草草了事,日后一定用KMP算法解决本题,然后回来再次更新文章。原创 2023-06-16 09:57:19 · 78 阅读 · 0 评论 -
二刷LeetCode--22. 括号生成(C++版本)回溯法例题
本题思路主要还是几种回溯法的使用,可以想象为二叉树,一直向左子树加入左括号,当加入的左括号到达最大限制,就回退到上一层,然后自然需要向右子树加入右括号,然后依次递归,还是需要注意递归的终止条件,在左右括号都达到最大的时候则需要将本次的结果存在最终的字符串数组中,原创 2023-06-15 22:07:13 · 139 阅读 · 0 评论 -
报错:non-const lvalue reference to type ‘std::string‘ cannot bind to a value of unrelated 不能对临时变量加引用
下面是该段代码给出的报错,大致意思是不能对临时变量加引用。如果要对临时变量加引用的话,必须在其前面加上Const,因为如果不加const的话,编译器会认为下面代码会修改这个临时变量,而且这个变量将会被返回并且对代码有一定影响。小编在写LeetCode–22.括号生成的时候发现传值的时候一个小问题,代码如下。下午是从隔壁搬运的,这是链接,说的很好。原创 2023-06-15 20:55:18 · 569 阅读 · 0 评论 -
二刷LeetCode--19. 删除链表的倒数第 N 个结点(C++版本)
本题主要是需要注意leetcode上head指针指的是第一个数据节点,而不是我们平时习惯的头节点,因此计数的时候需要注意,本人使用算出正数的第几个数据,然后找到其前驱节点进行删除。原创 2023-06-08 11:42:42 · 70 阅读 · 0 评论 -
LeetCode中单链表的head是头指针还是头节点
头节点是在链表的第一个数据节点之前,而此时的头指针指向的实际上是头节点,头节点可以不带数据,也可以带一些特殊的数据比如链表长度等,这种情况下判断链表是否为空就可以使用if(head -> next == NULL)。而头指针一般指向的是链表的第一个数据节点,而这也是力扣上单链表的head所表示的含义,因此力扣上写相关单链表的问题可以注意,有一些题比如删除倒数第k个链表这种题,如果使用总数减去所给数拿到正数的数字然后进行遍历的话,需要注意此问题否则会导致计算的链表长度出错。然后计数的时候就会导致错误。原创 2023-06-07 22:05:28 · 642 阅读 · 1 评论 -
二刷LeetCode--17. 电话号码的字母组合(C++版本)基于回溯算法
对于本题而言,需要将结果放在一个字符数组中,因此我们需要维护一个临时的字符类型的临时变量,每次将临时变量放入到最终的结果数组内。每次遍历到一个数字,就对这个数字对应的全部字符进行深度优先遍历,这里的index对应的就是digits中的每一个字符变量(也就是字符数组digits的下标)。对于每一个digits的数组的数字,都对应有三个或者四个字符,那么这些字符就是我们需要获取到的并将其放入到临时变量中。原创 2023-06-06 21:02:06 · 75 阅读 · 0 评论 -
二刷LeetCode--15. 三数之和(C++版本)
本题思路较为简单,使用枚举的方式即可完成.首先枚举第一个数字,那么后面的两个数据的和应该是第一个数据的相反数,为了加快比较效率,我们对原始的数据进行排序,那么如果上一个和这一个数据相同的话就不需要再进行枚举.而且对于第三个数据来说,我们可以使用两端数据相加和与目标值的大小来判断第三个数据应该在的位置,也可以加快比较速度.原创 2023-06-06 15:17:32 · 56 阅读 · 0 评论 -
二刷LeetCode--11. 盛最多水的容器(C++版本)
本题算比较简单的,从一侧进行遍历势必会导致超时,这种情况一般我们使用两边向内遍历的方式较好,每次比较新位置的盛水量,然后与当前的最大值进行比较,将较大的留下进行下一次比较。原创 2023-05-31 19:55:36 · 53 阅读 · 0 评论 -
二刷LeetCode--8. 字符串转换整数 (atoi)(C++版本)
这个题需要注意的是越界的判断,如果不能记住2的31次方的话可以使用pow函数进行计算,然后依次进行字符的读入即可,在计算的时候需要将字符转化为数字进行计算.最后需要与现有的结果和越界值进行比较,如果越界了需要按照题目的要求进行取舍.原创 2023-05-30 15:49:49 · 46 阅读 · 0 评论 -
二刷LeetCode--3. 无重复字符的最长子串(C++版本)
这里的第二种方法是我们本次使用的,即用哈希表和滑动窗口进行解答,滑动窗口依次将每一个元素做为起始位置的无重复子串进行判断并与当前的最长子串长度进行比较,将较大的赋值给最终结果,这里不使用unordered_map是因为其是键值对的组合,在插入以及判断元素是否存在的时候不如unordered_set方便,因此选用后者作为基本数据结构进行。原创 2023-05-29 21:53:54 · 57 阅读 · 0 评论 -
二刷LeetCode--7. 整数反转(C++版本)巧妙思路
这里我们使用两种方法进行作答,首先是将字符转为字符串,字符串反转,然后进行字符串转为数字,但是需要判断的是转换之后的数字是否超出了界限,因此比较巧妙的是使用C++的异常处理机制。方法二就是每次取出最后一位数字然后依次进行加和,完成数据的反转,但是需要注意,临时变量可能会出现溢出的情况,因此要对临时变量的数据类型变为长整型。原创 2023-04-21 22:05:35 · 77 阅读 · 1 评论 -
二刷LeetCode--2. 两数相加(C++版本)
本题采用正常的思路,即两个指针对应位置进行相加,头指针不动,尾指针一直向后滑动进行计算,主要加法运算需要考虑进位的情况,因此每次计算结束之后如果进位的标记不为0,则尾指针需要再向后走一步。原创 2023-04-19 11:26:01 · 129 阅读 · 0 评论 -
二刷LeetCode--350. 两个数组的交集 II、234. 回文链表(C++版本)
本题第一个方法较为简单,将元素存储至数组中然后进行常规的双指针遍历。第二种方法较为复杂, 原地进行题目的求解,避免了额外空间的申请,首先使用快慢指针进行链表的分割,快指针一次走两步,慢指针一次走一步,慢指针最终会停留在中间位置,然后使用自定义反转链表的函数将后半段反转,使用反转后的头开始向后遍历,与之前的前半段进行比较,完成题目。本题对其中一个数组元素的出现次数进行记录,然后在下一个数组中查找每一个元素之于上一个数组的出现次数,当出现次数不为零的时候就将当前元素加入到结果数组中。原创 2023-03-31 21:00:04 · 69 阅读 · 0 评论 -
二刷LeetCode--326. 3 的幂、344. 反转字符串、387. 字符串中的第一个唯一字符、412. Fizz Buzz(C++版本)
按照题目要求写好判断语句即可,然后每次将临时字符串加入到最终的字符串数组中.统计字符串的每个字母出现次数然后将出现一次的进行返回即可。双指针从两边向中间进行游走然后将字符进行交换即可.本题使用取余+相除进行计算,得到最终结果。原创 2023-03-27 14:30:52 · 85 阅读 · 0 评论 -
二刷LeetCode--242. 有效的字母异位词、268. 丢失的数字、283. 移动零(C++版本)
本题常见的两个思路,一个比较简单,直接进行排序,然后判断排序后的两个新单词是不是一一对应的字母,第二种思路使用数组进行存储每个字母的出现次数,在遍历第二个单词的时候进行次数的减少,当发现次数减少到负数的时候说明两个单词的字母出现次数不同,返回false.本题使用比较简单的覆盖方式进行非零元素的填坑,然后将末尾缺少的位置补零.本题思路较为简单,排序后依次查找不存在的数字,记录之后返回即可。原创 2023-03-27 10:23:05 · 67 阅读 · 0 评论 -
二刷LeetCode--217. 存在重复元素、206. 反转链表、202. 快乐数、191. 位1的个数(C++版本)
1<<i 是将1左移i位,即第i位为1,其余位为0;n&(1<<i)是将左移i位的1与n进行按位与,即为保留n的第i位,其余位置零;本题按照题意进行判断,对每一个位置的元素拿出来进行平方和计算,然后每次计算完成之后更新当前的数据,注意,本题需要留意,如果之前已经出现过该结果,那么说明出现死循环,因此我们使用哈希表进行每次结果的保存,然后进行查询。本题常见的方法如下两种,可以排序然后看前后相邻的元素是否相等,也可以将元素依次存入哈希表,然后每次放入新元素的时候看是否当前的元素已经出现在哈希表中。原创 2023-03-18 22:05:13 · 56 阅读 · 0 评论 -
二刷LeetCode--160. 相交链表、169. 多数元素、141. 环形链表(C++版本)
本题与上面的题一样,属于思路类,可以通过排序,将位于一半位置的元素返回,该元素一定是多数元素。链表成环在使用快慢指针时需要将快指针首先向前走一步然后进行判空与是否和慢指针相等判断。本题属于思路题,主要考虑从起始点到交点的距离,或者使用从后向前进行寻找不相等的节点。原创 2023-03-07 11:17:30 · 54 阅读 · 0 评论 -
二刷LeetCode--108. 将有序数组转换为二叉搜索树、125. 验证回文串、136. 只出现一次的数字(C++版本)
本题可以使用哈希表进行,最后将second为1的元素取出,但是不满足题意,空间复杂度会高,因此使用较为巧妙的办法,利用逻辑运算异或的特性将全部的字符异或即可得到结果。回文串较为简单,从左右两侧开始向中间滑动即可,需要注意的是按照题目要求将字符转化为小写然后取消空格和其他的干扰。题目给出有序数组,因此可以通过递归,每次选取中间位置得元素作为树根,然后不断得分割目前序列,直到递归终止。原创 2023-03-02 17:18:38 · 72 阅读 · 0 评论 -
二刷LeetCode-- 118. 杨辉三角、121. 买卖股票的最佳时机(C++版本)
此类问题可以一行一行考虑,但是需要知道当前行除了第一个和最后一个元素之外,其他的元素都是经过上一行的两个元素相加得到的,因此我们可以考虑每一行,状态转移方程为res[i][j] = res[i - 1][j - 1] + res[i - 1][j],处理一下第一个和最后一个元素即可。本题对于每一天的价钱都需要考虑当天的价格是不是最小的价格,以及当天的价格减去最小值,和已知的最大利润进行比较来判断是否更新最大利润。原创 2023-03-01 22:01:40 · 90 阅读 · 0 评论 -
二刷LeetCode-- 69. x 的平方根、101. 对称二叉树、104. 二叉树的最大深度(C++版本)
对于递归来讲,主要是其递归的终止条件,以及递归的迭代方式。尽可能使用二分,不要使用较为简单的数学对数方法。本题解法直接看代码即可,思路较为简单。原创 2023-02-28 20:39:16 · 59 阅读 · 0 评论 -
二刷LeetCode--26. 删除有序数组中的重复项、70. 爬楼梯、88. 合并两个有序数组(C++版本)
合并数组首先可以想到使用与合并链表相同的想法,但是本题需要原地进行数组的合并,因此我们通过引入新的临时数组进行合并最后进行元素的赋值即可;本题首先在于读懂题目需求,本题需要在原地进行重复数的删除,那么就需要使用两个指针,快指针在遇到不用元素的时候将其值赋给慢指针,然后慢指针接收到新值之后向后移一位。动态规划问题首先需要处理边界条件以及状态转移方程,然后按照方程进行代码的书写即可,本题的状态转移方程通过找规律的方式进行。原创 2023-02-27 21:08:46 · 86 阅读 · 0 评论 -
二刷LeetCode--20. 有效的括号、21. 合并两个有序链表、66. 加一(C++版本)
从后向前遍历对应数组,以及相关问题的处理方法,首先假设数字不全为0,那么从后向前,找到第一个非9的数字,将其加一,然后将其后的全部元素置为0即可.如果数字全为9的话,只需要新创建一个全0的数组,长度比之前的大一即可,然后手动将第一位置为1.链表合并以及合理的使用游走指针进行新链表的合成,还有剩余旧链表的处理。栈的基本入栈出栈操作,以及如何通过栈解决类似问题。原创 2023-02-25 21:08:19 · 68 阅读 · 0 评论 -
二刷LeetCode--1. 两数之和、13. 罗马数字转整数、14. 最长公共前缀(C++版本)
复习知识点:纵向对比二维数组时候的循环变量的写法:内部循环遍历每一列,并且比较的时候应该是行在前,列在后。复习知识点:哈希表初始化:使用大括号进行初始化,元素也使用大括号包含,两个元素之间使用逗号分割。复习知识点:哈希表中的auto类型以及对应的迭代器写法。原创 2023-02-23 22:03:57 · 89 阅读 · 0 评论 -
LeetCode--378. 有序矩阵中第 K 小的元素(C++描述)
题目分析:左上角和右下角的元素求出中间位置的元素,然后需要判断从开始到中间位置元素的个数有多少个,如果小于给定的k值的话,说明需要的元素在右边,反之在左侧,还需要一个算法就是统计从开始位置到中间位置元素的个数的想法,从左下角开始向右遍历,如果当前的元素小于中间位置的元素值,那么需要向右边的一行遍历,如果大于中间位置的值,需要向上一行遍历,然后计数器的计算需要根据行的列表进行递增。输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8。原创 2022-12-08 18:54:37 · 110 阅读 · 0 评论 -
LeetCode--334. 递增的三元子序列(C++描述)
// Source :https://leetcode.cn/problems/increasing-triplet-subsequence/// Date : 2022-12-7/**************************************************************************************给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k原创 2022-12-07 11:41:25 · 124 阅读 · 0 评论 -
LeetCode--347. 前 K 个高频元素(C++描述)
// Source :https://leetcode.cn/problems/top-k-frequent-elements/// Date : 2022-12-6/**************************************************************************************给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2原创 2022-12-06 19:09:30 · 182 阅读 · 0 评论 -
LeetCode--324. 摆动排序 II(C++描述)
// Source :https://leetcode.cn/problems/wiggle-sort-ii/// Date : 2022-12-4/**************************************************************************************给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。你可以假设所有输入数组都可以得到满足题目要求的结果。示原创 2022-12-04 13:07:36 · 277 阅读 · 0 评论 -
LeetCode--328. 奇偶链表(C++描述)
// Source :https://leetcode.cn/problems/odd-even-linked-list/// Date : 2022-12-4/**************************************************************************************给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数原创 2022-12-04 13:01:50 · 188 阅读 · 0 评论 -
LeetCode--300. 最长递增子序列(C++描述)
题目分析:dp[i]表示考虑前i个元素,即dp[i]=max(dp[ j ]) + 1,其中,0 < j < i && num[i] > num[j],即考虑往dp[0…例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。输入:nums = [10,9,2,5,3,7,101,18]输入:nums = [7,7,7,7,7,7,7]输入:nums = [0,1,0,3,2,3]原创 2022-11-30 16:22:52 · 339 阅读 · 0 评论