LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
0.15 动态规划
[70. 爬楼梯](https://leetcode.cn/problems/climbing-stairs/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def climbStairs(self, n: int) -> int: dp = [0] * (n+1) if n < 2: return 1 dp[0] = 1 dp[1] = 1 for i in range(2,n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` [118. 杨辉三角](https://leetcode.cn/problems/pascals-triangle/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def generate(self, numRows: int) -> List[List[int]]: dp = [[1] * (i+1) for i in range(numRows)] for i in range(numRows): for j in range(1,i): dp[i][j] = dp[i-1][j-1] + dp[i-1][j] return dp ``` [198. 打家劫舍](https://leetcode.cn/problems/house-robber/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def rob(self, nums: List[int]) -> int: n = len(nums) dp = [0] * n if n < 2: return max(nums) dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) for i in range(2,n): dp[i] = max(dp[i-1], dp[i-2]+nums[i]) return dp[-1] ``` [279. 完全平方数](https://leetcode.cn/problems/perfect-squares/?envType=study-plan-v2&envId=top-100-liked) ```python import math class Solution: def numSquares(self, n: int) -> int: dp = [inf] * (n+1) dp[0] = 0 dp[1] = 1 for i in range(2,n+1): for j in range(1,isqrt(i) + 1): dp[i] = min(dp[i], dp[i-j*j] + 1) return dp[n] ``` [322. 零钱兑换](https://leetcode.cn/problems/coin-change/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def coinChange(self, coins: List[int], amount: int) -> int: dp = [inf] * (amount+1) dp[0] = 0 for i in range(1,amount+1): for coin in coins: if coin <= i: dp[i] = min(dp[i], dp[i-coin] + 1) return dp[amount] if dp[amount] != inf else -1 ``` [139. 单词拆分](https://leetcode.cn/problems/word-break/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: n = len(s) dp = [False] * (n+1) dp[0] = True for i in range(1, n+1): for j in range(i): if dp[j] and s[j:i] in wordDict: dp[i] = True break return dp[n] ``` [300. 最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/?envType=study-plan-v2&envId=top-100-liked) $$O(N^2)$$ ```python class Solution: def lengthOfLIS(self, nums: List[int]) -> int: n = len(nums) dp = [1] * n for i in range(n): for j in range(i): if nums[j] < nums[i]: dp[i] = max(dp[i], dp[j]+1) return max(dp) ``` $$O(NlogN)$$ ```python class Solution: def findfirst(self, nums, target): n = len(nums) left, right = 0, n-1 while left <= right: mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 return left def lengthOfLIS(self, nums: List[int]) -> int: n = len(nums) res = [] for num in nums: i = self.findfirst(res, num) if i == len(res): res.append(num) else: res[i] = num return len(res) ``` [152. 乘积最大子数组](https://leetcode.cn/problems/maximum-product-subarray/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: class Solution: def maxProduct(self, nums: List[int]) -> int: n = len(nums) min_dp = [inf] * n max_dp = [-inf] * n res = min_dp[0] = max_dp[0] = nums[0] for i in range(1, n): candidate = (nums[i], min_dp[i - 1] * nums[i], max_dp[i - 1] * nums[i]) min_dp[i] = min(candidate) max_dp[i] = max(candidate) res = max(res, max_dp[i]) return res ``` [416. 分割等和子集](https://leetcode.cn/problems/partition-equal-subset-sum/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def canPartition(self, nums: List[int]) -> bool: total = sum(nums) if total % 2 == 1: return False target = total // 2 @cache def dfs(i, cur_sum): if cur_sum == target: return True if i == len(nums) or cur_sum > target: return False return dfs(i + 1, cur_sum) or dfs(i + 1, cur_sum + nums[i]) return dfs(0, 0) ``` ```python class Solution: def canPartition(self, nums: List[int]) -> bool: total = sum(nums) if total % 2 == 1: return False target = total // 2 dp = [False] * (target + 1) dp[0] = True for num in nums: for i in range(target, num - 1, -1): if dp[i - num]: dp[i] = True if dp[target]: return True return dp[target] ``` [32. 最长有效括号](https://leetcode.cn/problems/longest-valid-parentheses/?envType=study-plan-v2&envId=top-100-liked) ```python class Solution: def longestValidParentheses(self, s: str) -> int: stack = [-1] res = 0 for i in range(len(s)): if s[i] == "(": stack.append(i) else: stack.pop() if not stack: stack.append(i) else: res = max(res, i - stack[-1]) return res ``` 动态规划 ``` class Solution: def longestValidParentheses(self, s: str) -> int: n = len(s) if n == 0: return 0 dp = [0] * n res = 0 for i in range(1, n): if s[i] == ")": if s[i - 1] == "(": dp[i] = (dp[i - 2] if i >= 2 else 0) + 2 elif i - dp[i - 1] > 0 and s[i - dp[i - 1] - 1] == "(": dp[i] = ( dp[i - 1] + 2 + (dp[i - dp[i - 1] - 2] if (i - dp[i - 1]) >= 2 else 0) ) res = max(res, dp[i]) return res ```
嘉心糖糖
2025年9月27日 22:36
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码