
LeetCode刷题
文章平均质量分 82
精品西红柿
这个作者很懒,什么都没留下…
展开
-
Leetcode 4.21
用vector去存罗马数字symbol对应的数值val,如果val比num小,则num -= val;与题目3相同,注意题目:不重复的四元组!这个题可以遍历数组,固定一个元素,target - nums[i],就变成了3数之和的解法。可以排列组合的题目都可以首先联想到全排列,递归时先判断是否符合递归终止条件,不符合则依次加当前电话号码位置对应的字母,加完后递归,用unordered_map去存罗马数字对应的数值,分情况讨论,把所有情况都列出来即可。需要注意的点:去重!原创 2024-04-21 23:22:32 · 310 阅读 · 4 评论 -
Leetcode 4.18
状态dp[i][j]表示s[…i]与p[…j]是否能够匹配。dp[s.size()-1][p.size()-1]即为本题答案。状态转移当。原创 2024-04-18 23:02:15 · 720 阅读 · 1 评论 -
Leetcode 4.5
DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后**,恢复状态,回溯上一层,再次搜索**。当问题需要 “回头”,以此来查找出所有的解的时候,使用回溯算法。: 在搜索中,遇到“这条路不可能和目标字符串匹配成功”的情况,例如当前矩阵元素和目标字符不匹配、或此元素已被访问,则应立即返回,从而避免不必要的搜索分支。由于我们这条路是可以回头的,并非只能往右下方向走,所以可能会遇到回踩前一个刚刚访问过的格子,而这个格子,题目里说是不可以重复使用的。原创 2024-04-05 17:17:26 · 800 阅读 · 0 评论 -
Leetcode 4.2
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。原创 2024-04-02 23:56:10 · 362 阅读 · 0 评论 -
Leetcode 4.1
否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次「不必要的跳跃次数」,因此我们不必访问最后一个元素。可以这么理解 想象你在玩大富翁,回合制游戏,随身带的钱决定你每回合最多可以走多少格,需要以最短的回合数到达终点。格子里面的数字代表“钱”,每回合你需要停留在格子里休息得到补充的“钱”才能继续行走。每次走到一个格子的时候,你需要估计预算在下一个回合能走多少格,哪个格子的钱最多,下一回合就去那个格子。但是前面的格子里有多少钱有战争迷雾看不到,要到了才知道。原创 2024-04-01 21:47:40 · 847 阅读 · 0 评论 -
Leetcode 3.26
第K个最大元素用堆做比较容易,可以维护一个只有K个元素的大根堆,如果元素个数超过K则pop,也就是将堆顶大元素删除,那么当前堆就是一个以第K大元素为堆顶的大根堆。堆可以用priority_queue实现。本题难点在于priority_queue的相关知识,如何自定义比较方式等。比如本题的数据类型并不是基本数据类型,而是pair<int, int>,所以需要自定义比较方式。思路是维护一个递减栈,存储的是当前元素的位置。原创 2024-03-26 23:57:31 · 1009 阅读 · 0 评论 -
Leetcode 3.25
void push(int val) 将元素val推入堆栈----> stack push(val) 以及 stack_min.push(min(val, stack_min.top()))难点就在于如何获取最小元素,一个栈正常push元素,另一个栈存放当前栈中的最小元素。void pop() 删除堆栈顶部的元素----> stack.pop() stack_min.pop()int top() 获取堆栈顶部的元素-----> stack top()其实与括号的题目有点类似,用两个栈,分别为数字栈字母栈。原创 2024-03-26 00:16:05 · 425 阅读 · 0 评论 -
Leetcode 3.18
递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。假设当前的节点 p 的值为 val,我们对左子树和右子树进行递归搜索,对节点 p 的左孩子节点 pl 求出。: 当 (1) root 为叶节点(左右子树均为空) 且 (2) 路径和等于目标值(targetSum == 0),则将此路径 tmp 加入 ans。我们可以递归遍历记录所有的路径,同时计算路径和,如果等于那么添加到最终的vector<vector< int >>中。: 当前节点 root ,当前目标值 targetSum。原创 2024-03-18 21:40:00 · 851 阅读 · 0 评论 -
Leetcode 3.15
根据前序和中序遍历我们可以确定二叉树的根节点,左子树和右子树,不断递归得到结果。比较复杂的是确定左右子树的边界。借助map来快速确定元素在inorder中的位置,这副图中的边界位置建议仔细推导。题目要求展开后与先序遍历相同,那么可以按照先序遍历再更改链表,在前序遍历结束之后更新每个节点的左右子节点的信息,找到前后元素在二叉树当中的位置,将二叉树展开为单链表。方法一:我们只需存储升序遍历,返回升序遍历的结果即可。改进:我们还可以在找到答案后停止,不需要遍历整棵树。函数作用:将一个二叉树,原地将它展开为链表。原创 2024-03-16 00:04:55 · 385 阅读 · 0 评论 -
Leetcode 3.14
来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r) 的范围内说明不满足条件直接返回,否则我们要继续递归调用检查它的左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。如果该二叉树的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。原创 2024-03-15 00:21:45 · 396 阅读 · 0 评论 -
Leetcode 3.13
特别需要注意的点:这道题虽然是求路径,按题目中描述4->3->2->1的路径长度只有3,但是在递归时,我们不能直接return 3,因为你不知道当前递归到二叉树的哪一层,是否为root,每一次都必须返回该节点为根的子树的深度,在最终的返回结果中再减1。4.都不为空,那么仔细观察,左右子树是不相等的,左子树的右子树 等于 右子树的左子树:root->left->right == root->right->left;并且,当前层root->left->val == root->right->val;原创 2024-03-13 22:31:12 · 903 阅读 · 0 评论 -
Leetcode 3.12
设置两指针 left, right 分别指向两链表头部,比较两指针处节点值大小,由小到大加入合并链表头部,指针交替前进,直至添加完两个链表。空间复杂度:O(logn),其中 n 是链表的长度。返回辅助ListNode dummy作为头部的下个节点 h.next。双指针法合并,建立辅助 ListNode* dummy 作为头部。先用一个循环,用unordered_map把两个链表捆绑。时间复杂度:O(nlogn),其中 n 是链表的长度。再用一个循环构建新链表的引用指向。原创 2024-03-12 23:26:40 · 915 阅读 · 0 评论 -
leetcode 2.27
由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。或者vector还是[]的时候(考虑官方测试数据的输入可能为[]的情况,使用[ ]前需要判断一下是否为空)会报错!3.怎么找到最小数,也不能说是最小数,是一个连续数种的最小数,num - 1如果存在那么他就不是连续的最小数。2.num[i + 1]到num[j]的和为 pre[j] - pre[i]1.用pre[i]表示num[0]到num[i]的和。原创 2024-02-27 22:37:35 · 1097 阅读 · 1 评论 -
leetcode 2.28
3)边界条件:dp[0][0] = 1;、正常列,dp[i][j]=dp[i-1][j]+grid[i][j-1];2)转移方程:dp[i][j] = nums[i][j] + min(d[i-1][j],d[i][j-1]);3)边界条件:dp[0] = nums[0], dp[1] = max(nums[0], nums[1])2)转移方程:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];2)转移方程:d[i][j]=d[i-1][j]+d[i][j-1];原创 2024-02-28 23:52:31 · 901 阅读 · 0 评论 -
leetcode 2.29
方法二:把二维n * m展开为一维数组,需要注意的是一维数组中下标为N的数,在二维数组中的对于坐标为[N / m][N % m]时间复杂度:O(logn),其中 n 为数组的长度。二分查找所需的时间复杂度为 O(logn)。空间复杂度:O(1)。我们只需要常数空间存放若干变量。方法一:先二分确定列,再二分确定行。原创 2024-02-29 23:23:35 · 498 阅读 · 0 评论 -
leetcode 3.1
第二次遍历 i = 1, j = 2,a与c不等,也不能是0,这里需转换成 a 与 ac 最长子序列,这里需要把之前的关系传递过来,所以dp[1][2] = 1。第四次遍历 i = 2, j = 1,就是需要比较ab与a的最长子串,把之前的关系传递过来,所以dp[2][1] = 1。对比的两个字符相同,去找它们前面各退一格的值加1即可:dp[i+1][j+1] = dp[i][j] + 1;第三次遍历 i = 1, j = 3,a与e不相同,把之前的关系传递过来,所以dp[1][3] = 1。原创 2024-03-01 19:22:32 · 1057 阅读 · 0 评论 -
leetcode 3.4
数组的索引对应于字符在字母表中的位置,例如 ‘a’ - ‘a’ = 0,‘b’ - ‘a’ = 1,以此类推。如果ans.back()[0] >= num[0] 那么需要合并,ans.back()[1] = max(ans.back()[1], num[1]);随后遍历剩余string,保证滑窗内只有m个元素,添加s[j],则删除s[j - m];经典滑动窗口,左右指针控制当前滑动窗口的大小,用map去存储当前滑动窗口内的字母个数。如果s[r]在map里,说明有重复,则左指针右移,直到s[r]无重复为止;原创 2024-03-05 00:28:02 · 382 阅读 · 0 评论 -
leetcode 3.5
pre保留的是当前包含了当前遍历的最大的前缀和,如果之前的pre 对结果有增益效果,则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果,需要舍弃,则 pre 直接更新为当前遍历数字;空间复杂度:O(m+n),其中 mmm 是矩阵的行数,nnn 是矩阵的列数。时间复杂度:O(mn),其中 mmm 是矩阵的行数,nnn 是矩阵的列数。可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。先用两个for记录出现0的行和列,再用两个for去标记出现0的所有行列元素。原创 2024-03-05 23:55:44 · 431 阅读 · 0 评论 -
leetcode 3.6
matrix[i][j] 最终会被交换到 matrix [j][n−i−1]位置,最初思路是直接上三角交换,但是会存在问题,有几个元素是无法交换到的。,创建两个指针 pA 和 pB,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。基于上一题环形链表,如果slow和fast相遇,让其中一个指针重新指向head,并且两个指针都每次只走一步,再次相遇就是环的入口。对于主对角线翻转而言,我们只需要枚举对角线左侧的元素,和右侧的元素进行交换,即。原创 2024-03-06 23:26:19 · 985 阅读 · 0 评论 -
Leetcode 3.7
在排序数组中查找元素的第一个和最后一个位置寻找target在数组里的左右边界,有如下三种情况:情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}原创 2024-03-07 21:48:29 · 939 阅读 · 0 评论 -
leetcode 3.11
的排好序的数组中,在数组的 [begin, end) 区间中二分查找第一个小于等于value的数,找到返回该数字的地址,没找到则返回end。的排好序的数组中,在数组的 [begin, end) 区间中二分查找第一个小于value的数,找到返回该数字的地址,没找到则返回end。以下为个人总结,仅供参考。的排好序的数组中,在数组的 [begin, end) 区间中二分查找第一个。的排好序的数组中,在数组的 [begin, end) 区间中二分查找。value的数,找到返回该数字的地址,没找到则返回end。原创 2024-03-11 22:06:07 · 928 阅读 · 1 评论 -
菜鸡刷题-1
很久不刷题了,再次刷题手太生了,痛定思痛,还是继续刷吧,立帖为证,天天坚持217. 存在重复元素给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。解题思路;1.排序,则若有重复会出现在相邻位置,扫描数组,比较相邻位置元素是否相等获取vector长度用size()class Solution {public: bool containsDuplicate(vector<i...原创 2021-10-17 22:50:07 · 154 阅读 · 0 评论 -
剑指offer第二版易错点总结P2
剑指offer易错点总结剑指 Offer 57 - II. 和为s的连续正数序列剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 58 - II. 左旋转字符串剑指 Offer 59 - I. 滑动窗口的最大值易错点总结剑指 Offer 57 - II. 和为s的连续正数序列首项加末项乘以项数除以二:class Solution {public: vector<vector<int>> findContinuousSequence(int target原创 2020-09-03 10:27:59 · 131 阅读 · 0 评论 -
剑指offer第二版易错总结P1
易错点总结易错点剑指 Offer 18. 删除链表的节点易错点剑指 Offer 18. 删除链表的节点必须要new一个dummy,而不是直接创建一个ListNode*,具体原因:原创 2020-09-02 10:11:26 · 170 阅读 · 0 评论 -
数组操作(Leetcode)
1.螺旋矩阵1)将螺旋矩阵当作一个框,规定上下左右边界:上:0下:m.size()-1左:0右:m[0].size()-12)返回条件:上边界>下边界 || 左边界>右边界class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> ans; //原创 2020-08-17 22:29:15 · 82 阅读 · 0 评论 -
从 两数之和 — 四数之和(LeetCode)
N数之和==target的思路关键点有以下几个:1.先排序,固定一个元素,利用指针移动其余元素两数则固定一个元素+指针;三数则固定两个元素+双指针;四数则固定一个元素+三数和。2.比较当前和与target的大小,移动指针。因为提前将数组排序过,所以若当前和>target,则l--;若当前和<target,则r++;若当前和==target,则return或保存。3.如果题目要求不重复,则去掉重复元素。重复元素有两种:第一种就是数组中元...原创 2020-08-08 22:01:11 · 146 阅读 · 0 评论