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 发布
-
+
首页
6.9 练习
# 6.9 练习 ## 基础难度 ### [213. House Robber II](https://leetcode.com/problems/house-robber-ii/) 强盗抢劫题目的 follow-up,如何处理环形数组呢? ```py class Solution: def myrob(self, nums): n = len(nums) if n < 2: return max(nums) dp = [0] * n dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) for i in range(2,n): dp[i] = max(dp[i-2] + nums[i], dp[i-1]) return dp[-1] def rob(self, nums: List[int]) -> int: n = len(nums) if n < 2: return max(nums) case1 = self.myrob(nums[:-1]) case2 = self.myrob(nums[1:]) return max(case1,case2) ``` --- ### [53. Maximum Subarray](https://leetcode.com/problems/maximum-subarray/) 经典的一维动态规划题目,试着把一维空间优化为常量吧。 dp[i] 表示以 nums[i] 结尾的最大子数组和 ```py class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) if n == 0: return 0 dp = [0] * n dp[0] = nums[0] for i in range(1, n): dp[i] = max(dp[i-1], 0) + nums[i] return max(dp) ``` --- ### [343. Integer Break](https://leetcode.com/problems/integer-break/) 分割类型题,先尝试用动态规划求解,再思考是否有更简单的解法。 ```py class Solution: def integerBreak(self, n: int) -> int: # n = 2, max = 1 # n = 3, max = 2 = max(1*2, 2*1, 1*1*1) # n = 4, max = 4 = max(1*3, 2*2, 3*1, 1*1*1*1) dp = [-1] * (n + 1) dp[1] = 1 dp[2] = 1 for i in range(3, n + 1): for j in range(1, i): dp[i] = max(dp[i], j * (i - j), j * dp[i - j]) return dp[n] ``` --- ### [583. Delete Operation for Two Strings](https://leetcode.com/problems/delete-operation-for-two-strings/) dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。 ```py class Solution: def minDistance(self, word1: str, word2: str) -> int: m, n = len(word1), len(word2) dp = [[inf] * (n+1) for _ in range(m+1)] dp[0][0] = 0 for i in range(1,m+1): dp[i][0] = i for j in range(1,n+1): dp[0][j] = j for i in range(1, m+1): for j in range(1,n+1): if word1[i-1] == word2[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] +1, dp[i-1][j-1]+2) return dp[m][n] ``` --- ## 进阶难度 ### [646. Maximum Length of Pair Chain](https://leetcode.com/problems/maximum-length-of-pair-chain/) 最长递增子序列的变种题,同样的,尝试用二分进行加速。 --- ### [10. Regular Expression Matching](https://leetcode.com/problems/regular-expression-matching/) 正则表达式匹配,非常考验耐心。需要根据正则表达式的不同情况,即字符、星号,点号等,分情况讨论。 --- ### [376. Wiggle Subsequence](https://leetcode.com/problems/wiggle-subsequence/) 最长摆动子序列,通项公式比较特殊,需要仔细思考。 --- ### [494. Target Sum](https://leetcode.com/problems/target-sum/) 如果告诉你这道题是 0-1 背包,你是否会有一些思路? --- ### [714. Best Time to Buy and Sell Stock with Transaction Fee](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) 建立状态机,股票交易类问题就会迎刃而解。
嘉心糖糖
2025年3月22日 19:07
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码