按照面试概率从高到低进行排列如下:
codeTop
数组和字符串操作codeTop
- Two Sum (两数之和)
- Valid Palindrome (验证回文字符串)
- Reverse String (反转字符串)
- Rotate Image (旋转图像)
- Contains Duplicate (存在重复元素)
- Move Zeroes (移动零)
- K Closest Points to Origin (最接近原点的 K 个点)
- String to Integer (atoi) (字符串转换整数 (atoi))
- Implement strStr() (实现 strStr() 函数)
- First Unique Character in a String (字符串中的第一个唯一字符)
链表
- Add Two Numbers (两数相加)
- Reverse Linked List (反转链表)
- Merge Two Sorted Lists (合并两个有序链表)
- Intersection of Two Linked Lists (两个链表的交点)
- Remove Nth Node From End of List (删除链表的倒数第N个节点)
- 206. 反转链表, 36
- 25. K 个一组翻转链表, 27
- 160. 相交链表, 25
- 141. 环形链表, 14
- 19. 删除链表的倒数第N个节点, 13 + 3 = 16
- 21. 合并两个有序链表, 15 + 6 = 21
- 143. 重排链表, 1
- 剑指 Offer 22. 链表中倒数第k个节点, 2
哈希表/映射
- 146. LRU缓存机制, 30 (困难)
- 1. 两数之和, 15 + 1 = 16
- 170. 两数之和 III - 数据结构设计, 1
数组/字符串
- 215. 数组中的第K个最大元素, 35
- 53. 最大子序和, 25 + 3 + 5 = 33
- 15. 三数之和, 21
- 54. 螺旋矩阵, 20
- 3. 无重复字符的最长子串, 3
- 67. 二进制求和, 1
- 415. 字符串相加, 1
树和图
- Binary Tree Level Order Traversal (二叉树的层序遍历)
- Maximum Depth of Binary Tree (二叉树的最大深度)
- Clone Graph (克隆图)
- Symmetric Tree (对称二叉树)
- Balanced Binary Tree (平衡二叉树)
- Number of Connected Components in an Undirected Graph (无向图中的连通分量的数目)
- Serialize and Deserialize BST (序列化和反序列化二叉搜索树)
动态规划
设计
- LRU Cache (LRU 缓存机制)
- Find Median from Data Stream (数据流的中位数)
- Design Twitter (设计推特)
- Design Search Autocomplete System (设计搜索自动补全系统)
- Design HashSet (设计哈希集合)
- Design Circular Queue (设计循环队列)
- Design Hit Counter (设计点击计数器)
- Design Linked List (设计链表)
- Design Circular Deque (设计循环双端队列)
- Design a Leaderboard (设计排行榜)
- Design In-Memory File System (设计内存文件系统)
- All O'one Data Structure (全 O(1) 的数据结构)
并发与多线程
其他相关概念
- Moving Average from Data Stream (数据流中的移动平均值)
- Implement Trie (Prefix Tree) (实现 Trie (前缀树))
- Flatten 2D Vector (扁平化二维向量)
- Range Sum Query 2D - Mutable (二维区域和检索 - 可变)
- Sliding Window Maximum (滑动窗口最大值)
- Random Pick with Weight (按权重随机选择)
- Implement Rand10() Using Rand7() (用 Rand7() 实现 Rand10())
- Count of Smaller Numbers After Self (计算右侧小于当前元素的个数)
- Find K Pairs with Smallest Sums (查找和最小的 K 对数字)
- Logger Rate Limiter (日志速率限制器)
- Stream of Characters (字符流)
- LFU Cache (LFU 缓存)
- Insert Delete GetRandom O(1) (常数时间插入、删除和获取随机元素)
- Maximum Size Subarray Sum Equals k (和为 k 的最长子数组长度)
- My Calendar I, II, III (我的日程安排 I, II, III)
- Time Based Key-Value Store (基于时间的键值存储)
- Word Search II (单词搜索 II)
栈/队列
- 232. 用栈实现队列, 16 + 2 + 1 = 19
- 155. 最小栈, 1
- 895. 最大频率栈, 1 (困难)
二叉树
- 103. 二叉树的锯齿形层次遍历, 18 + 2 = 20
- 236. 二叉树的最近公共祖先, 14
- 102. 二叉树的层序遍历, 14 + 1 = 15
- 105. 从前序与中序遍历序列构造二叉树, 1
- 101. 对称二叉树, 1
数学/算法
- 69. x 的平方根, 1 (困难)
- 224. 基本计算器, 1 (困难)
- 368. 最大整除子集, 1
- 300. 最长上升子序列, 1
其他
- 370. 区间加法, 1
- 90. 子集 II, 1
- 1310. 子数组异或查询, 1
- 1442. 形成两个异或相等数组的三元组数目, 1
- 1610. 可见点的最大数目, 1
- 229. 求众数 II, 1
- 296. 最佳的碰头地点, 1
- 208. 实现 Trie (前缀树), 1
分类总结:
数组和字符串操作
-
- 锻炼能力: 数组操作,哈希表的使用。
- 实际使用场景: 在购物车、订单处理等场景中,可能需要从多个项目中找出总价匹配特定金额的组合。
- 面试概率: 高
-
- 锻炼能力: 字符串操作,双指针技巧。
- 实际使用场景: 文本处理,如搜索、广告系统等场合。
- 面试概率: 中
-
- 锻炼能力: 字符串操作。
- 实际使用场景: 输入预测、自动纠错等文本处理场景。
- 面试概率: 中
-
- 锻炼能力: 多维数组操作。
- 实际使用场景: 图像处理、游戏开发。
- 面试概率: 中
-
- 锻炼能力: 数组操作,哈希表。
- 实际使用场景: 数据去重,如联系人列表、图片库等。
- 面试概率: 中
-
- 锻炼能力: 数组操作。
- 实际使用场景: 数据清洗,如删除无效数据。
- 面试概率: 中
-
K Closest Points to Origin (最接近原点的 K 个点)
- 锻炼能力: 数组操作,排序,优先队列。
- 实际使用场景: 地图应用中的位置排序、推荐系统。
- 面试概率: 中
-
String to Integer (atoi) (字符串转换整数 (atoi))
- 锻炼能力: 字符串操作,状态机。
- 实际使用场景: 用户输入处理,文本转换。
- 面试概率: 中
-
Implement strStr() (实现 strStr() 函数)
- 锻炼能力: 字符串操作,滑动窗口,KMP。
- 实际使用场景: 文本搜索、高亮显示。
- 面试概率: 中
- 锻炼能力: 字符串操作,哈希表。
- 实际使用场景: 文本处理,如拼写检查、关键词提取。
- 面试概率: 中
链表
- 锻炼能力: 链表操作,数学运算。
- 实际使用场景: 数值计算,如大数加法。
- 面试概率: 高
- 锻炼能力: 链表基本操作。
- 实际使用场景: 数据操作,如历史记录的展示。
- 面试概率: 高
- 锻炼能力: 链表操作。
- 实际使用场景: 数据合并,如合并两个有序的联系人列表。
- 面试概率: 中
- 锻炼能力: 链表操作,双指针。
- 实际使用场景: 查找数据的交集,如找出两个用户的共同好友。
- 面试概率: 中
- 锻炼能力: 链表操作,双指针。
- 实际使用场景: 数据删除,如删除最近的历史记录。
- 面试概率: 中
当然,我会为您继续进行详细的分析。
树和图
-
Binary Tree Level Order Traversal (二叉树的层序遍历)
- 锻炼能力: 树的层次遍历。
- 实际使用场景: 数据的层级结构展示,如文件系统、组织结构等。
- 面试概率: 高
-
Maximum Depth of Binary Tree (二叉树的最大深度)
- 锻炼能力: 递归,深度优先搜索。
- 实际使用场景: 数据的深度分析,如网页抓取、网络分析等。
- 面试概率: 高
-
- 锻炼能力: 图的深度和广度优先搜索。
- 实际使用场景: 数据复制,如复制社交网络的关系图。
- 面试概率: 中
-
- 锻炼能力: 递归,树的遍历。
- 实际使用场景: 数据结构的对称性检查。
- 面试概率: 中
-
- 锻炼能力: 递归,树的深度计算。
- 实际使用场景: 数据结构的平衡性分析。
- 面试概率: 中
-
Number of Connected Components in an Undirected Graph (无向图中的连通分量的数目)
- 锻炼能力: 图的遍历,连通性分析。
- 实际使用场景: 网络分析,如社交网络中的社区检测。
- 面试概率: 中
-
Serialize and Deserialize BST (序列化和反序列化二叉搜索树)
- 锻炼能力: 树的编码和解码。
- 实际使用场景: 数据存储和恢复,如数据库的备份与恢复。
- 面试概率: 中
动态规划
-
- 锻炼能力: 动态规划,状态转移。
- 实际使用场景: 路径规划,如地图应用中的多种路径选择。
- 面试概率: 高
-
Best Time to Buy and Sell Stock (买卖股票的最佳时机)
- 锻炼能力: 动态规划,状态转移。
- 实际使用场景: 财务分析,如股票买卖策略分析。
- 面试概率: 高
- 锻炼能力: 动态规划,状态转移。
- 实际使用场景: 资源优化,如资源分配策略。
- 面试概率: 高
设计
- 锻炼能力: 设计缓存机制,哈希表,双向链表。
- 实际使用场景: 数据缓存,如浏览器缓存、数据库缓存。
- 面试概率: 高
- 锻炼能力: 数据流处理,堆。
- 实际使用场景: 实时数据分析,如股票价格的实时中位数计算。
- 面试概率: 中
当然,为您补充剩余的题目分析。
设计
- 锻炼能力: 设计数据结构,时间复杂度优化。
- 实际使用场景: 社交网络功能的实现,如发布、关注、获取新鲜事。
- 面试概率: 中
- 锻炼能力: 字典树(Trie),设计。
- 实际使用场景: 搜索引擎的自动补全功能。
- 面试概率: 中
- 锻炼能力: 数据结构设计,哈希表实现。
- 实际使用场景: 数据去重,集合操作。
- 面试概率: 中
- 锻炼能力: 队列的设计与实现。
- 实际使用场景: 数据缓冲,任务调度。
- 面试概率: 中
- 锻炼能力: 时间窗口处理,数据流。
- 实际使用场景: 网站流量分析,点击率统计。
- 面试概率: 低
- 锻炼能力: 链表设计与操作。
- 实际使用场景: 自定义数据结构,内存管理。
- 面试概率: 中
- 锻炼能力: 双端队列设计与操作。
- 实际使用场景: 数据缓冲,任务的优先级调度。
- 面试概率: 低
- 锻炼能力: 数据排序,设计。
- 实际使用场景: 游戏排行榜,评分系统。
- 面试概率: 低
- 锻炼能力: 树形数据结构设计,文件系统模拟。
- 实际使用场景: 文件管理,目录操作。
- 面试概率: 低
- 锻炼能力: 设计,常数时间操作优化。
- 实际使用场景: 快速数据查询与更新,如缓存系统。
- 面试概率: 低
并发与多线程
- 锻炼能力: 多线程同步。
- 实际使用场景: 并发任务调度,资源共享。
- 面试概率: 中
- 锻炼能力: 线程同步,资源分配。
- 实际使用场景: 资源管理,如数据库连接池管理。
- 面试概率: 低
- 好的,我会继续为您分析每个题目。
其他相关概念
-
Moving Average from Data Stream (数据流中的移动平均值)
- 锻炼能力: 数据流处理,队列。
- 实际使用场景: 实时数据分析,如股票价格的移动平均线。
- 面试概率: 中
-
Implement Trie (Prefix Tree) (实现 Trie (前缀树))
- 锻炼能力: 数据结构设计,前缀树。
- 实际使用场景: 字符串检索,如搜索引擎的自动补全。
- 面试概率: 高
-
- 锻炼能力: 迭代器设计,二维数据处理。
- 实际使用场景: 数据处理,如多维数据的一维化展示。
- 面试概率: 中
-
Range Sum Query 2D - Mutable (二维区域和检索 - 可变)
- 锻炼能力: 二维数据处理,树状数组或线段树。
- 实际使用场景: 图片处理,如计算图片的某个区域的亮度。
- 面试概率: 低
-
Sliding Window Maximum (滑动窗口最大值)
- 锻炼能力: 滑动窗口,双端队列。
- 实际使用场景: 实时数据分析,如计算某时间窗口内的最大值。
- 面试概率: 高
-
Random Pick with Weight (按权重随机选择)
- 锻炼能力: 前缀和,二分搜索。
- 实际使用场景: 加权随机策略,如广告展示的权重分配。
- 面试概率: 中
-
Implement Rand10() Using Rand7() (用 Rand7() 实现 Rand10())
- 锻炼能力: 数学,概率转换。
- 实际使用场景: 随机数生成器的设计。
- 面试概率: 中
-
Count of Smaller Numbers After Self (计算右侧小于当前元素的个数)
- 锻炼能力: 树状数组,线段树或归并排序。
- 实际使用场景: 数据统计,如实时排行榜的动态更新。
- 面试概率: 中
-
Find K Pairs with Smallest Sums (查找和最小的 K 对数字)
- 锻炼能力: 堆,排序。
- 实际使用场景: 优先队列,如推荐系统中根据评分推荐最佳组合。
- 面试概率: 低
- 锻炼能力: 设计,哈希表。
- 实际使用场景: API调用频率限制,防止服务被恶意请求。
- 面试概率: 低
- 锻炼能力: 前缀树(Trie),数据流处理。
- 实际使用场景: 文字输入预测,如键盘的下一个字预测。
- 面试概率: 中
- 锻炼能力: 设计,哈希表。
- 实际使用场景: 数据缓存,如数据库查询缓存,根据使用频率优化。
- 面试概率: 低
- 锻炼能力: 哈希表,数组。
- 实际使用场景: 数据库设计,如支持随机访问的数据结构。
- 面试概率: 中
- 锻炼能力: 哈希表,前缀和。
- 实际使用场景: 数据分析,如寻找满足特定条件的数据子集。
- 面试概率: 中
- 锻炼能力: 设计,区间问题。
- 实际使用场景: 事件调度,如会议室预约系统。
- 面试概率: 低
- 锻炼能力: 设计,哈希表,二分搜索。
- 实际使用场景: 版本控制系统,如Git。
- 面试概率: 低
- 锻炼能力: 回溯,前缀树。
- 实际使用场景: 文字游戏,如“找单词”游戏。
- 面试概率: 中
国内大厂喜欢的题
链表类
- 142. 环形链表 II
- 206. 反转链表
- 160. 相交链表
- 141. 环形链表
- 19. 删除链表的倒数第N个节点
- 83. 删除排序链表中的重复元素
- 82. 删除排序链表中的重复元素 II
- 21. 合并两个有序链表
数组/字符串类
- 3. 无重复字符的最长子串
- 53. 最大子序和
- 215. 数组中的第K个最大元素
- 15. 三数之和
- 54. 螺旋矩阵
- 121. 买卖股票的最佳时机
- 1. 两数之和
- 67. 二进制求和
- 415. 字符串相加
- 125. 验证回文串
- 43. 字符串相乘
- 5. 最长回文子串
- 56. 合并区间
- 33. 搜索旋转排序数组
- 394. 字符串解码
- 678. 有效的括号字符串
栈/队列
二叉树
- 144. 二叉树的前序遍历
- 102. 二叉树的层序遍历
- 236. 二叉树的最近公共祖先
- 103. 二叉树的锯齿形层次遍历
- 101. 对称二叉树
- 110. 平衡二叉树
- 105. 从前序与中序遍历序列构造二叉树
- 958. 二叉树的完全性检验
数学/算法
- 69. x 的平方根
- 32. 最长有效括号
- 剑指 Offer 10- I. 斐波那契数列
- 42. 接雨水
- 300. 最长上升子序列
- 70. 爬楼梯
- 10. 正则表达式匹配
- 223. 矩形面积
- 11. 盛最多水的容器
其他
- 559. N叉树的最大深度
- 25. K 个一组翻转链表
- 208. 实现 Trie (前缀树)
- 剑指 Offer 39. 数组中出现次数超过一半的数字
- 88. 合并两个有序数组
- 剑指 Offer 67. 把字符串转换成整数
- 92. 反转链表 II
- 905. 按奇偶排序数组
- LCP 17. 速算机器人
- 283. 移动零
- 剑指 Offer 56 - I. 数组中数字出现的次数
- 78. 子集
- 704. 二分查找
- 129. 求根到叶子节点数字之和
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 721. 账户合并
- 803. 打砖块
- 1202. 交换字符串中的元素
- 1143. 最长公共子序列
- 2. 两数相加
- 442. 数组中重复的数据
- 23. 合并K个排序链表
- 234. 回文链表
更大的分类
##哈希表
- 0001 两数之和 - 简单 - 哈希表
- 0217 存在重复元素 - 简单 - 哈希表
- 0219 存在重复元素 II - 简单 - 哈希表
- 0036 有效的数独 - 中等 - 哈希表
- 0242 有效的字母异位词 - 简单 - 哈希表、排序
- 0205 同构字符串 - 简单 - 哈希表
- 0449 字母异位词分组 - 中等 - 哈希表、字符串处理
- 0350 两个数组的交集 II - 简单 - 哈希表、双指针
- 0136 只出现一次的数字 - 简单 - 位运算、哈希表
- 0268 丢失的数字 - 简单 - 数学、位运算
- 0015 三数之和 - 中等 - 数组、双指针
- 0454 四数相加 II - 中等 - 哈希表
- 0383 赎金信 - 简单 - 哈希表、计数
- 0202 快乐数 - 简单 - 哈希表、数学
- 0599 两个列表的最小索引总和 - 简单 - 哈希表
- 0447 回旋镖的数量 - 中等 - 哈希表、数学
- 0811 子域名访问计数 - 中等 - 哈希表、字符串处理
- 0359 日志速率限制器 - 简单 - 设计、哈希表
- 0442 数组中重复的数据 - 中等 - 哈希表
- 0387 字符串中的第一个唯一字符 - 简单 - 哈希表、字符串
- 0451 根据字符出现频率排序 - 中等 - 哈希表、排序
- 0149 直线上最多的点数 - 困难 - 哈希表、数学
- 0705 设计哈希集合 - 简单 - 设计、哈希表
- 0706 设计哈希映射 - 简单 - 设计、哈希表
- 0018 四数之和 - 中等 - 数组、哈希表、双指针
- [0128 最长连续序列](https://leetcode-cn
.com/problems/longest-consecutive-sequence/) - 中等 - 哈希表 27. 0041 缺失的第一个正数 - 困难 - 数组、哈希表
字符串
字符串基础题目
- 0014 最长公共前缀 - 简单 - 字符串遍历
- 0125 验证回文串 - 简单 - 双指针
- 0344 反转字符串 - 简单 - 双指针
- 0557 反转字符串中的单词 III - 简单 - 字符串处理
- 0415 字符串相加 - 简单 - 字符串遍历,模拟
- 0049 字母异位词分组 - 中等 - 哈希表、排序
- 0003 无重复字符的最长子串 - 中等 - 滑动窗口、哈希表
- 0005 最长回文子串 - 中等 - 动态规划、中心扩展法
- 0151 颠倒字符串中的单词 - 中等 - 字符串处理
- 0043 字符串相乘 - 中等 - 字符串、模拟
单模式串匹配题目
- 0028 实现 strStr() - 简单 - 双指针、KMP
- 0459 重复的子字符串 - 简单 - 字符串处理
- 0796 旋转字符串 - 简单 - 字符串处理
- 1408 数组中的字符串匹配 - 简单 - 字符串处理
- 0686 重复叠加字符串匹配 - 中等 - 字符串处理
字典树题目
- 0208 实现 Trie (前缀树) - 中等 - 字典树
- 0677 键值映射 - 中等 - 字典树
- 0648 单词替换 - 中等 - 字典树
- 0211 添加与搜索单词 - 数据结构设计 - 中等 - 字典树
- 0676 实现一个魔法字典 - 中等 - 字典树
- 0421 数组中两个数的最大异或值 - 中等 - 字典树、位运算
- 0212 单词搜索 II - 困难 - 字典树、DFS
- 0336 回文对 - 困难 - 字典树、哈希表
- 0425 单词方块 - 困难 -
字典树、回溯 10. 0440 字典序的第K小数字 - 困难 - 数学
堆栈
堆栈基础题目
- 0020 有效的括号 - 简单 - 栈、字符串
- 0155 最小栈 - 简单 - 栈、设计
- 1047 删除字符串中的所有相邻重复项 - 简单 - 栈、字符串
- 0227 基本计算器 II - 中等 - 栈、字符串
- 0739 每日温度 - 中等 - 栈、哈希表
- 0150 逆波兰表达式求值 - 中等 - 栈
- 0232 用栈实现队列 - 简单 - 栈、设计
- 剑指 Offer 09 用两个栈实现队列 - 简单 - 栈、设计
- 0394 字符串解码 - 中等 - 栈、深度优先搜索
- 0946 验证栈序列 - 中等 - 栈、数组
单调栈
- 0739 每日温度 - 中等 - 栈、哈希表
- 0496 下一个更大元素 I - 简单 - 栈、数组、哈希表
- 0503 下一个更大元素 II - 中等 - 栈、数组
- 0901 股票价格跨度 - 中等 - 栈、设计
- 0084 柱状图中最大的矩形 - 困难 - 栈、数组
- 0042 接雨水 - 困难 - 栈、数组、双指针、动态规划
队列基础题目
- 0622 设计循环队列 - 中等 - 队列
- 0346 数据流中的移动平均值 - 简单 - 队列、数组
- 0225 用队列实现栈 - 简单 - 栈、设计
优先队列题目
- 0703 数据流中的第 K 大元素 - 简单 - 堆、设计
- 0347 前 K 个高频元素 - 中等 - 堆、哈希表
- 0451 根据字符出现频率排序 - 中等 - 哈希表、字符串、桶排序
- 0973 最接近原点的 K 个点 - 中等 - 堆、分治
- 0239 滑动窗口最大值 - 困难 - 队列、数组、滑动窗口
二叉树
二叉树的遍历题目
- 0104 二叉树的最大深度 - 简单 - 深度优先搜索、递归
- 0102 二叉树的层序遍历 - 中等 - 广度优先搜索
- 0094 二叉树的中序遍历 - 简单 - 栈、树
- 0144 二叉树的前序遍历 - 简单 - 栈、树
- 0145 二叉树的后序遍历 - 简单 - 栈、树
- 0111 二叉树的最小深度 - 简单 - 深度优先搜索、广度优先搜索
- 0100 相同的树 - 简单 - 深度优先搜索
- 0101 对称二叉树 - 简单 - 深度优先搜索、广度优先搜索
- 0226 翻转二叉树 - 简单 - 递归
- 0124 二叉树中的最大路径和 - 困难 - 深度优先搜索
二叉树的还原题目
- 0105 从前序与中序遍历序列构造二叉树 - 中等 - 分治法
- 0106 从中序与后序遍历序列构造二叉树 - 中等 - 分治法
- 0889 根据前序和后序遍历构造二叉树 - 中等 - 分治法
二叉搜索树题目
- 0098 验证二叉搜索树 - 中等 - 深度优先搜索
- 0700 二叉搜索树中的搜索 - 简单 - 递归
- 0701 二叉搜索树中的插入操作 - 中等 - 递归
- 0450 删除二叉搜索树中的节点 - 中等 - 递归
- 0235 二叉搜索树的最近公共祖先 - 简单 - 递归
单源最短路径题目
- 0743 网络延迟时间 - 中等
- 1631 最小体力消耗路径 - 中等 - 深度优先搜索、广度优先搜索、并查集、二分查找
- 0787 K 站中转内最便宜的航班 - 中等
- 0407 接雨水 II - 困难
多源最短路径题目
次短路径题目
- 2045 到达目的地的第二短时间 - 困难
差分约束系统
- 1109 航班预订统计 - 中等 - 数组、前缀和
- 0995 K 连续位的最小翻转次数 - 困难 - 位运算、数组、前缀和、滑动窗口
二分图基础题目
- 0785 判断二分图 - 中等 - 深度优先搜索、广度优先搜索、并查集、图
二分图最大匹配题目
- 1947 最大兼容性评分和 - 中等
- LCP 04 覆盖 - 困难
基础算法
枚举算法题目
- 0001 两数之和 - 简单 - 数组、哈希表
- 0560 和为 K 的子数组 - 中等 - 数组、哈希表、前缀和
- 0204 计数质数 - 中等 - 数学、哈希表
递归算法题目
- 0206 反转链表 - 简单 - 链表
- 0104 二叉树的最大深度 - 简单 - 树、深度优先搜索、递归
- 0344 反转字符串 - 简单 - 字符串
分治算法题目
- 0004 寻找两个正序数组的中位数 - 困难 - 数组、二分查找、分治算法
回溯算法题目
- 0046 全排列 - 中等 - 回溯算法
- 0047 全排列 II - 中等 - 数组、回溯
贪心算法题目
- 0455 分发饼干 - 简单 - 贪心、数组、排序
- 0860 柠檬水找零 - 简单 - 贪心、数组
位运算题目
- 0190 颠倒二进制位 - 简单 - 位运算
- 0191 位1的个数 - 简单 - 位运算
链表刷题思路
1. 刷题思路:
- 理解链表结构:链表是一种线性数据结构,其中每个元素都是一个独立的对象。每个元素(称为“节点”)都有两个项:节点的数据和指向下一个节点的引用。
- 明确问题:确保您清楚地理解了问题和期望的输出。例如,问题可能是查找、修改、删除或其他操作。
- 边界情况:考虑链表为空或只有一个节点的情况。
2. 常见策略和方法:
- 快慢指针:这是解决链表问题的常用策略,尤其是涉及到查找中间节点、检测循环或确定循环长度的问题。
- 双指针:对于某些问题,例如查找倒数第k个节点,您可以使用两个指针,第一个指针先移动k步,然后两个指针同时移动,直到第一个指针到达链表的末尾。
- 递归:某些链表问题,特别是涉及到反转链表或合并两个有序链表的问题,可以使用递归来解决。
- 哑节点(dummy node) :在处理链表的插入和删除操作时,哑节点可以帮助简化边界情况,尤其是在链表的头部和尾部。
- 修改链表结构:在某些情况下,例如复制带有随机指针的链表,您可能需要先修改链表的结构,然后再恢复它。
3. 注意事项:
- 不要丢失引用:在修改链表时,确保始终保持对链表部分的引用,否则您可能会丢失部分或全部链表。
- 检查空指针:在进行链表操作时,始终检查指针是否为空,以避免空指针异常。
- 循环:确保在进行操作时,您没有无意中创建一个循环链表,除非题目要求这样做。
- 修改链表时的顺序:当您需要修改链表结构(如插入、删除或移动节点)时,请注意操作的顺序,以确保链表的完整性。
总的来说,链表是数据结构和算法中的基本主题,理解其基本概念和常见策略对解决相关问题至关重要。
哈希表刷题思路
哈希表题目特点:
- 快速查找:哈希表的主要优势是能够在常数时间内完成查找操作。
- 键值对:哈希表通常用于存储键值对,其中键是唯一的。
- 去重:由于哈希表中的键是唯一的,它经常被用于去重操作。
- 计数问题:哈希表经常被用于计数,例如统计一个数组中的每个元素的出现次数。
常见的解题套路:
- 频率计数:当需要统计元素的频率时,可以使用哈希表。
- 累计和:在处理子数组和等于特定值的问题时,可以使用哈希表来存储累计和及其出现的次数。
- 双索引:例如在两数之和的问题中,可以使用哈希表来查找与当前元素匹配的另一个元素。
- 缓存:例如在 LRU 缓存设计中,哈希表与双向链表结合,提供了快速的查找和更新操作。
需要注意的细节:
- 碰撞处理:虽然在现实编程中,如 Python 的字典或 Java 的 HashMap,我们不需要处理碰撞,但在某些面试或编程挑战中,可能需要。
- 哈希函数:选择一个好的哈希函数可以确保数据均匀分布,从而提高哈希表的效率。
- 可变键:如果哈希表的键是可变的,如 Python 中的列表,那么在使用前需要先将其转换为不可变的类型,如元组。
常见的分析思维逻辑流程:
- 确定需求:首先要确定是否需要快速查找、计数或去重。
- 选择数据结构:如果需要上述的操作,哈希表很可能是一个好选择。
- 考虑空间与时间:虽然哈希表提供了快速的查找,但它也使用了额外的空间。在某些情况下,需要权衡时间和空间。
- 边界情况:考虑哈希表为空或非常大时的情况。
总的来说,哈希表是解决许多 LeetCode 问题的强大工具。通过练习和分析,可以更熟练地使用哈希表来优化解决方案。