
leetcode刷题总结
文章平均质量分 81
zs1996_
算法工程师
展开
-
【leetcode】数组刷题总结(二)滑动窗口
滑动窗口算法技巧主要用来解决子数组问题,比如让你寻找符合某个条件的最长/最短子数组或者子串。对于某些题目,并不需要穷举所有子串,就能找到题目想要的答案。滑动窗口就是这种场景下的一套算法模板,帮你对穷举过程进行剪枝优化,将求解子串复杂度由O(N^2)->O(N)原创 2025-02-11 21:33:48 · 774 阅读 · 0 评论 -
【leetcode】哈希表刷题总结
和三数之和思路相同,四数之和的双指针解法是两层for循环nums[i] + nums[j]为确定值,然后循环内有left和right下标作为双指针,找出nums[i] + nums[j] + nums[left] + nums[right] == target的情况,四数之和的时间复杂度是O(n^3)这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于四数之和简单了不少,用哈希表就可以解决。原创 2024-07-07 11:15:24 · 636 阅读 · 0 评论 -
【leetcode】图论刷题总结
深度优先搜索(dfs)是可一个方向去搜,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯),所以用递归的方式来实现是最方便的。原创 2024-06-09 21:23:53 · 543 阅读 · 0 评论 -
【leetcode】贪心刷题总结
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。贪心算法唯一的难点就是如何通过局部最优,推出整体最优。如果手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。如果不可行,可能需要动态规划。将局部最优解堆叠成全局最优解。将问题分解为若干个子问题。求解每一个子问题的最优解。原创 2024-05-02 20:10:51 · 337 阅读 · 2 评论 -
【leetcode】数学刷题总结
如果一个人拿的时候只剩4颗石子,那么无论他怎么拿,总会剩下1~3颗石子,对手都能赢。原创 2024-06-23 16:59:51 · 1267 阅读 · 0 评论 -
【leetcode】优先队列/字典树刷题总结
基础题# 建堆# 不断粉碎堆顶两个石头重量,并将剩余石头重量重新加入堆中。原创 2024-05-23 22:34:56 · 320 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(六)-划分问题
一般定义dp[i]表示nums[:i + 1]能否划分,然后枚举最后一个子数组的左端点,得到nums[:i + 1]能否划分。原创 2024-11-09 09:56:42 · 555 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(五)-状态机问题
能买无数次,与“买卖股票的最佳时机II”的区别:由于有手续费,所以卖出股票时需要添加手续费。能买无数次,相对只能买1次,主要变化在dp[0]的递推公式。只能买k次,需要记录2*k个状态。原创 2024-05-18 12:10:56 · 239 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(七)-区间问题
区间DP问题一般从数组的左右两端不断缩短,求解关于某段下标区间的最优值,dp[i][j]一般定义为下标区间[i,j]的最优值。原创 2024-10-30 22:42:29 · 393 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(二)-网格问题
将环形问题转化为线性问题,分别计算不考虑首尾元素的情况。原创 2024-05-16 23:38:49 · 210 阅读 · 0 评论 -
【leetcode】栈/队列/单调栈/单调队列刷题总结
需要两个栈(一个,一个)来实现队列操作在push数据的时候,只要数据放进输入栈就好。但在pop的时候,输出栈如果为空,就把输入栈数据全部导入进来,再弹出数据;如果输出栈不为空,则直接弹出数据就可以。原创 2024-07-09 23:04:26 · 415 阅读 · 0 评论 -
【leetcode】链表刷题总结
链表的类型:单链表、双链表、循环链表链表操作中一个重要的技巧是链表操作当前节点必须要找前一个节点才能操作,这就造成了头结点的尴尬,因为头结点没有前一个节点了,每次头结点都要单独处理,使用虚拟头结点可以简化代码。原创 2024-06-28 09:19:10 · 428 阅读 · 0 评论 -
【leetcode】字符串刷题总结
模拟反转过程就可以。原创 2024-07-05 19:15:51 · 749 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(四)-子序列问题
t[i-1]时,dp[i][j]=dp[i-1][j],即只删除t中的元素,不需要删除s中的元素比较。所以还可以压缩为1维DP数组。所以可维护一个数组d,d[i]表示长度为i + 1的最长递增子序列的末尾元素的最小值,不断更新d,d的最终长度就是最长自增子序列长度。如果要使递增子序列尽可能的长,需要让序列上升得尽可能慢,因此希望每次在递增子序列最后加上的那个数尽可能的小。相对“最长递增子序列”,本题简单在,每次只需要比较和前一个元素的大小。由于递推公式是从上到下、从左到右,所以无法压缩为1维DP数组。原创 2024-05-19 23:18:47 · 281 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(三)-背包问题
有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。01背包是每件物品只能用一次;完全背包是每件物品数量无限。求解目标是将哪些物品装入背包里物品价值总和最大。原创 2024-05-12 21:14:22 · 386 阅读 · 0 评论 -
【leetcode】数组刷题总结(一)二分查找、双指针、前缀和、差分、花式遍历
LeetCode167题 两数之和II-输入有序数组二分查找变体-查找目标为一对数LeetCode35题 搜索插入位置二分查找变体-查找目标的插入位置LeetCode34题 在排序数组中查找元素的第一个和最后一个位置查找有序重复数组的左右边界问题,与二分查找基础题相比,主要差异在对nums[mid]==target时的情况处理 LeetCode69题 x的平方根本质是在找符合r*r原创 2024-07-02 12:32:29 · 636 阅读 · 0 评论 -
【leetcode】动态规划刷题总结(一)-基础题
动态规划 + 单调队列解法:可以将dp数组设置为一个单调队列,只保留之前k个位置有机会成为最大的分数,这样队首元素就代表着前k个位置的最大分数。降低时间复杂度O(k*n)->O(n)# 维护一个单调队列,降低时间复杂度O(k*n)->O(n)# 此时nums[i]代表到达索引i的最大得分# 到达第k步时,开始弹出符合条件的元素# 将nums[i]加入单调队列。原创 2024-05-11 12:18:41 · 313 阅读 · 0 评论 -
【leetcode】回溯刷题总结
有递归就有回溯,递归与回溯相辅相成。回溯搜索法是纯暴力搜索算法。一般的回溯问题都可以抽象为树结构,树的深度为递归次数,树的宽度为候选集合大小。原创 2024-04-27 16:40:10 · 254 阅读 · 0 评论 -
【leetcode】排序问题总结
把待排序数组视为数组表示的完全二叉树,然后自底向上不断调整,使其成为一个大顶堆(升序排序)/小顶堆(降序排序),之后可以通过不断弹出堆顶元素进行排序建堆过程时间复杂度为O(n),堆排序过程时间复杂度为O(nlogn)原创 2024-08-02 23:11:48 · 367 阅读 · 0 评论 -
【leetcode】二叉树刷题总结(三)二叉搜索树问题
利用二叉搜索树特性,将搜索复杂度降为logn。原创 2024-07-28 17:35:08 · 441 阅读 · 0 评论 -
【leetcode】二叉树刷题总结(二)二叉树构造问题、最近公共祖先问题
先找到根节点,然后找到并递归构造左右子树即可:可以通过前序遍历结果找到根节点,然后根据中序遍历结果确定左右子树。通过前序后序遍历结果无法确定唯一的原始二叉树。前序遍历,迭代法实现。原创 2024-07-24 20:51:38 · 381 阅读 · 0 评论 -
【leetcode】二叉树刷题总结(一)分解思路、遍历思路
【代码】【leetcode】二叉树刷题总结。原创 2024-04-20 16:39:31 · 303 阅读 · 0 评论 -
【leetcode】二叉树分类、遍历方式、解题思路总结
二叉树分类二叉树分类满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。即深度为k,有2^k-1个节点的二叉树。完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;原创 2024-04-17 22:39:42 · 289 阅读 · 0 评论