:root{
/* 适配白底的深色/对比色方案 */
--page-bg: #ffffff; /* 页面背景(白色) */
--text: #0f1724; /* 主文本,深色,保证可读性 */
--muted: #334155; /* 次要文字 */
--card-bg: #f8fafc; /* 卡片浅灰(与白背景有分层) */
--border: #e6eef8; /* 卡片边框色 */
--accent1: #0b69ff; /* 主强调色(蓝) */
--accent2: #5b3cff; /* 次强调色(紫) */
--accent3: #d43f4a; /* 危险/提示色(红) */
--pill-bg: linear-gradient(90deg,#eef2ff,#f0f9ff);
}
/* 页面基础 */
body{
background: var(--pag ...
LearningNotes
未读
最后编辑于2025-07-16
23. 合并 K 个排序链表(Merge k Sorted Lists)Hard给定一个包含 k 个链表的数组 lists,每个链表都按升序排列。将所有链表合并为一个升序链表并返回合并后的链表头结点。
示例 1:输入: lists = [[1,4,5],[1,3,4],[2,6]]输出: [1,1,2,3,4,4,5,6]解释: 链表分别为 1->4->5, 1->3->4, 2->6,合并后为 1->1->2->3->4->4->5->6。
示例 2:输入: lists = []输出: []
示例 3:输入: lists = [[]]输出: []
约束:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
每个 lists[i] 已按升序排列
所有链表长度之和不会超过 10^4
总体思路与常见解法合并 k 个 ...
LearningNotes
未读
最后编辑于2025-07-13
22. 生成括号(Generate Parentheses)Medium给定 n 对括号,写一个函数生成所有由 n 对括号组成的合法(well-formed) 括号字符串。
示例 1:输入: n = 3输出: [("((()))","(()())","(())()","()(())","()()()")]
示例 2:输入: n = 1输出: [("()")]
约束:
1 <= n <= 8
解题思路(回溯 / 递归)这类“列出所有组合”的题型常用 回溯(Backtracking)。对于生成合法括号,关键在于维护左右括号剩余数量,并保证任何时刻已生成的前缀都是合法的(即左括号剩余数不能大于右括号剩余数,否则会出现以 ) 开头或中途负平衡的情形)。
定义递归函数 dfs(left, right, cur):
left:当前还能放的左括号数量(’(‘)。
right:当前还能放的右括号数量(’)’)。
cu ...
LearningNotes
未读
最后编辑于2025-07-10
21. 合并两个有序链表(Merge Two Sorted Lists)Easy给定两个按非递减顺序排序的链表 list1 和 list2 的头结点,将它们合并为一个新的有序链表,并返回合并后的头结点。合并应通过拼接原链表节点完成(不新建节点)。
示例:
输入:list1 = [1,2,4], list2 = [1,3,4] → 输出:[1,1,2,3,4,4]
输入:list1 = [], list2 = [] → 输出:[]
输入:list1 = [], list2 = [0] → 输出:[0]
约束:
两个链表节点数之和在 [0, 100] 范围内(题目原限制为各自 [0,50])。
-100 <= Node.val <= 100。
两个输入链表均已按非递减顺序排序。
思路此题与合并有序数组类似,核心思想是:在两个链表上同时遍历,每次比较当前节点的值,将较小的节点接到结果链表末尾。因为链表操作拼接成本低且不需要随机访问,用指针即可方便实现。常见实现有两种:迭代(使用虚拟头节点)与递归。
方法一:迭代(使用哑节点,推荐) ...
LearningNotes
未读
最后编辑于2025-07-07
20. 有效的括号(Valid Parentheses)Easy给定只包含字符 '(' , ')' , '{' , '}' , '[' , ']' 的字符串 s,判断该字符串是否为有效的括号字符串。有效的定义为:
左括号必须由相同类型的右括号闭合;
左括号必须以正确的顺序闭合;
每个右括号都有对应类型的左括号。
示例:
输入:s = "()" → 输出:true
输入:s = "()[]{}" → 输出:true
输入:s = "(]" → 输出:false
约束:
1 <= s.length <= 10^4
s 仅包含字符 '()[]{}'
思路(栈模拟)这是典型的栈题:遇到左括号就压栈;遇到右括号时检查栈顶是否为匹配的左括号。若不匹配或栈为空则返回 false,遍历结束后若栈为空则为 true ...
最后编辑于2025-07-04
19. 删除链表的倒数第 N 个节点(Remove Nth Node From End of List)Medium给定链表的头结点 head,删除链表的倒数第 n 个节点,并返回链表的头结点。
示例:
输入:head = [1,2,3,4,5], n = 2 → 输出:[1,2,3,5]
输入:head = [1], n = 1 → 输出:[]
输入:head = [1,2], n = 1 → 输出:[1]
约束:
链表长度 sz 满足 1 <= sz <= 30。
0 <= Node.val <= 100。
1 <= n <= sz。
进阶(Follow up): 是否可以一次遍历完成?
思路与实现(双指针,单次遍历)要求一次遍历完成删除倒数第 n 个节点,常用做法是 双指针(快慢指针):
设定两个指针 fast 和 slow,都指向链表头(或使用哨兵节点简化边界情况)。
先让 fast 向前走 n 步。此时如果 fast 为 nullptr,说明要删除的是头结点,直接返回 head-> ...
LearningNotes
未读
最后编辑于2025-07-01
18. 四数之和(4Sum)Medium给定整数数组 nums 和目标值 target,找出所有不重复的四元组 [nums[a], nums[b], nums[c], nums[d]],使得它们的和等于 target。可以任意顺序返回结果。
示例 1:输入: nums = [1,0,-1,0,-2,2], target = 0输出: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:输入: nums = [2,2,2,2,2], target = 8输出: [[2,2,2,2]]
约束:
1 <= nums.length <= 200
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
思路概览四数之和可以看作三数之和的推广,经典做法有两种:
排序 + 固定两层 + 双指针(O(n^3)):先排序,再枚举两个固定位置 i, j,剩下用左右指针在有序区间内寻找满足条件的两数对。核心在于做好去重(固定层跳过相同数字、找到解后 ...
最后编辑于2025-06-28
17. 电话号码的字母组合(Letter Combinations of a Phone Number)Medium给定一个仅包含数字 2-9 的字符串,返回所有该数字可能表示的字母组合(电话按钮映射)。可以按任意顺序返回答案。示例 1:输入: digits = "23"输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:输入: digits = ""输出: []
示例 3:输入: digits = "2"输出: ["a","b","c"]
约束:
0 <= digits.length <= 4
digits[i] 为字符 ‘2’ 至 ‘9’
思路与常见解法本题是典型的组合枚 ...
LearningNotes
未读
最后编辑于2025-06-25
16. 最接近的三数之和(3Sum Closest)Medium给定整数数组 nums(长度 n)和整数 target,从数组中找出三个整数,使它们之和最接近 target,返回这三个整数之和。题目保证答案唯一。
示例 1:输入: nums = [-1,2,1,-4], target = 1输出: 2解释: 最接近的和为 -1 + 2 + 1 = 2。
示例 2:输入: nums = [0,0,0], target = 1输出: 0
约束:
3 <= nums.length <= 500
-1000 <= nums[i] <= 1000
-10^4 <= target <= 10^4
思路(排序 + 双指针)本题与「三数之和」类似,经典做法依然是先对数组排序,然后固定一个数 nums[i],在其后部分用左右双指针寻找最接近 target - nums[i] 的两数之和。核心步骤:
对 nums 排序,便于双指针线性移动。
维护当前最优解 closest(初始化为前三个数之和)和最小差值 diff ...
LearningNotes
未读
最后编辑于2025-06-22
15. 三数之和(3Sum)Medium给定一个整数数组 nums,找出所有满足 nums[i] + nums[j] + nums[k] == 0 且 i, j, k 互不相同的三元组。返回的结果中不得包含重复三元组。
示例 1:输入: nums = [-1,0,1,2,-1,-4]输出: [[-1,-1,2],[-1,0,1]]
示例 2:输入: nums = [0,1,1]输出: []
示例 3:输入: nums = [0,0,0]输出: [[0,0,0]]
约束:
3 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5
思路与优化(排序 + 双指针)常见解法是先对数组排序,然后枚举第一个数 nums[k](作为固定项),在它之后使用双指针在有序数组中寻找两数之和等于 -nums[k] 的组合。关键点如下:
排序:让双指针可以线性地向中间收缩寻找满足和的两数对。
剪枝:当固定项 nums[k] > 0 时可直接停止枚举(因为后续均为正数,不可能凑出 0)。
去 ...


