LeetCode 热题 100 回顾

目录

一、哈希部分

1.两数之和 (简单)

2.字母异位词分组 (中等)

3.最长连续序列 (中等)

二、双指针部分

4.移动零 (简单)

5.盛最多水的容器 (中等)

6. 三数之和 (中等)

7.接雨水 (困难)

三、滑动窗口

8.无重复字符的最长子串 (中等)

9.找到字符串中所有字母异位词 (中等)

四、子串

10.和为 K 的子数组 (中等)

11.滑动窗口最大值 (困难)

12.最小覆盖子串 (困难)

五、普通数组

13.最大子数组和 (中等)

14.合并区间 (中等)

15.轮转数组 (中等)

16.除自身以外数组的乘积 (中等)

17.缺失的第一个正数 (困难)

六、矩阵

18.矩阵置零 (中等)

19.螺旋矩阵(中等)

20.旋转图像(中等)

21.搜索二维矩阵 II(中等)

七、链表

22.相交链表(简单)

23.反转链表(简单)

24.回文链表(简单)

25.环形链表(简单)

26. 环形链表 II(中等)

27.合并两个有序链表(简单)

28.两数相加(中等)

29.删除链表的倒数第 N 个结点(中等)

30.两两交换链表中的节点(中等)

31.K 个一组翻转链表 (困难)

32.随机链表的复制(中等)

33.排序链表(中等)

34.合并 K 个升序链表 (困难)

35.LRU 缓存(中等)

八、二叉树

36.二叉树的中序遍历(简单)

37.二叉树的最大深度(简单)

38.翻转二叉树(简单)

39.对称二叉树(简单)

40.二叉树的直径(简单)

41.二叉树的层序遍历(中等)

42.将有序数组转换为二叉搜索树(简单)

43.验证二叉搜索树(中等)

44.二叉搜索树中第 K 小的元素(中等)

45.二叉树的右视图(中等)

46.二叉树展开为链表(中等)

47.从前序与中序遍历序列构造二叉树(中等)

48.路径总和 III(中等)

49.二叉树的最近公共祖先(中等)

50.二叉树中的最大路径和 (困难)

九、图论

51.岛屿数量(中等)

52.腐烂的橘子(中等)

53.课程表(中等)

54.实现 Trie (前缀树)(中等)

十、回溯

55.全排列(中等)

56.子集(中等)

57.电话号码的字母组合(中等)

58.组合总和(中等)

59.括号生成(中等)

60.单词搜索(中等)

61.分割回文串(中等)

62.N 皇后 (困难)

十一、二分查找

63.搜索插入位置(简单)

64.搜索二维矩阵(中等)

65.在排序数组中查找元素的第一个和最后一个位置(中等)

66.搜索旋转排序数组(中等)

67.寻找旋转排序数组中的最小值(中等)

68.寻找两个正序数组的中位数 (困难)

十二、栈

69.有效的括号(简单)

70.最小栈(中等)

71.字符串解码(中等)

72.每日温度(中等)

73.柱状图中最大的矩形(困难)

十三、堆

74.数组中的第K个最大元素(中等)

75.前 K 个高频元素(中等)

76.数据流的中位数(困难)

十四、贪心算法

77.买卖股票的最佳时机(简单)

78.跳跃游戏(中等)

79.跳跃游戏 II(中等)

80.划分字母区间(中等)

十五、动态规划

81.爬楼梯(简单)

82.杨辉三角(简单)

83.打家劫舍(中等)

84.完全平方数(中等)

85.零钱兑换(中等)

86.单词拆分 (中等)

87.最长递增子序列  (中等)

88.乘积最大子数组 (中等)

89.分割等和子集 (中等)

90.最长有效括号(困难)

十六、多维动态规划

91.不同路径 (中等)

92.最小路径和(中等)

93.最长回文子串(中等)

94.最长公共子序列 (中等)

95.编辑距离(中等)

十七、技巧

96.只出现一次的数字(简单)

97.多数元素(简单)

98.颜色分类(中等)

99.下一个排列(中等)

100.寻找重复数(中等)


干货分享,感谢您的阅读!

一、哈希部分

1.两数之和 (简单)

题目描述

给定一个整数数组 nums 和一个整数目标值 

<think>好的,用户想找LeetCode100的C++解决方案。我需要先确定用户的具体需求,是不是需要具体的目解答,比如算法思路、代码示例或者优化方法。用户提到的引用内容中有几个代码示例,比如二进制求和、数组旋转、子数组和能被K整除等,这些可能是top100中的目。 首先,我应该整理LeetCode top100中常见的目类型,比如数组、字符串、动态规划、树、链表等。然后,根据用户提供的引用内容,看看是否有对应的目可以举例。例如,引用1中的二进制求和是LeetCode第67,属于字符串处理;引用2中的数组旋转是第189,涉及数组操作;引用3的子数组和能被K整除是第974,用到了前缀和和哈希表;引用4可能涉及图的最短路径问,比如第743。 接下来,我需要确保提供的代码示例符合用户要求,使用C++编写,并且是top100中的目。可能需要确认每个引用对应的目是否在top100列表中,但根据常见情况,像两数之和、反转链表、二叉树遍历等都属于高频。 用户可能需要每个目的简要思路和代码示例,同时生成相关问。例如,对于快速排序,用户示例中提供了代码和相关问,这里需要类似的结构。需要注意的是,用户要求回答结构清晰,逐步解决问,所以需要分步骤讲解每个目的解决方法,并附上代码。 另外,引用内容中的代码需要注意格式是否正确,比如引用1中的二进制求和代码是否有语法错误,是否需要调整。例如,代码中的循环条件和字符串操作是否正确,是否有转义字符的问。不过用户提供的代码可能存在一些HTML转义字符,比如<和>,需要转换为<和>,确保代码可读性。 最后,生成相关问时要围绕每个目的常见疑问,比如时间复杂度、优化方法、应用场景等。例如,对于数组旋转问,可以问如何在不使用额外空间的情况下解决,或者如何优化反转方法的性能。 总结步骤: 1. 确定LeetCode top100中的常见目,并匹配用户提供的引用中的例子。 2. 为每个例子提供问描述、解决思路、代码示例,并确保代码正确。 3. 生成每个目相关的后续问,帮助用户深入理解。 4. 检查引用标记是否正确,代码格式是否符合要求,避免语法错误。 5. 使用中文回答,保持结构清晰,分点说明。</think>以下整理了LeetCode100中部分经典问的C++解决方案,涵盖关键思路与代码实现: --- ### 1. 两数之和(Two Sum) **问描述**:给定数组和一个目标值,找出数组中两数之和等于目标值的索引。 **解决思路**:利用哈希表记录遍历过的数值及其索引,实现$O(1)$时间复杂度的查找[^1]。 ```cpp #include <vector> #include <unordered_map> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> num_map; for (int i = 0; i < nums.size(); ++i) { int complement = target - nums[i]; if (num_map.find(complement) != num_map.end()) { return {num_map[complement], i}; } num_map[nums[i]] = i; } return {}; } }; ``` --- ### 2. 反转链表(Reverse Linked List) **问描述**:将单链表反转。 **解决思路**:使用三个指针(前驱、当前、后继),逐步反转节点指向。 ```cpp struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *prev = nullptr, *curr = head; while (curr) { ListNode *next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } }; ``` --- ### 3. 二叉树的中序遍历(Binary Tree Inorder Traversal) **问描述**:非递归实现二叉树的中序遍历。 **解决思路**:使用栈模拟递归过程,优先访问左子树[^2]。 ```cpp #include <vector> #include <stack> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> stk; TreeNode *curr = root; while (curr || !stk.empty()) { while (curr) { stk.push(curr); curr = curr->left; } curr = stk.top(); stk.pop(); res.push_back(curr->val); curr = curr->right; } return res; } }; ``` --- ### 4. 子数组和能被K整除(Subarray Sums Divisible by K) **问描述**:统计数组中连续子数组的和能被K整除的数量。 **解决思路**:前缀和+哈希表记录余数频率,时间复杂度$O(n)$[^3]。 ```cpp #include <vector> #include <unordered_map> using namespace std; class Solution { public: int subarraysDivByK(vector<int>& nums, int k) { unordered_map<int, int> map = {{0, 1}}; int ans = 0, sum = 0; for (auto &num : nums) { sum += num; int mod = (sum % k + k) % k; // 处理负数取模 if (map.count(mod)) ans += map[mod]; map[mod]++; } return ans; } }; ``` --- §§ 1. 如何优化两数之和问以处理大数据量? 2. 反转链表的递归实现方法是什么? 3. 二叉树前序和后序遍历的非递归实现有何区别? 4. 如何证明前缀和+哈希表方法在子数组问中的正确性? --- **引用说明** : 哈希表优化查找时间的思路常用于数组和字符串问,如两数之和和二进制求和。 [^2]: 栈和队列是模拟递归和层次遍历的核心数据结构。 : 前缀和与哈希表结合可高效解决子数组和问,如LeetCode 974和560。 [^4]: 最短路径算法(如Dijkstra)中更新距离数组的方法与贪心策略相关。
评论 2032
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张彦峰ZYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值