1. LeetCode 每日一题的价值与意义
对于程序员来说,LeetCode 每日一题就像健身房的每日训练计划。它提供了一个系统化、持续性的算法能力提升路径。我坚持刷题三年多,最大的体会是:每日一题不在于题量,而在于养成持续思考的习惯。
2026年3月23日至29日的这组题目,涵盖了动态规划、贪心算法、二叉树等经典题型。这些题目看似独立,实则存在内在联系。比如3月23日的题目考察了二维动态规划,而3月25日的题目则在此基础上增加了状态压缩的变体。这种递进式的题目安排,能帮助我们从多个维度理解算法本质。
提示:建议按照题目顺序完成,不要跳着做。LeetCode官方在安排每日一题时,会考虑题目之间的递进关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 2026/3/23 题目详解:矩阵中的最长递增路径
2.1 问题描述
给定一个 m x n 整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以向上下左右四个方向移动。
示例:
输入:matrix = [
[9,9,4],
[6,6,8],
[2,1,1]
]
输出:4 (最长递增路径是1→2→6→9)
2.2 解题思路
这道题是典型的记忆化搜索+动态规划问题。我们需要为每个位置计算从该位置出发的最长递增路径长度,并缓存结果避免重复计算。
核心思路:
- 定义dfs(i,j)表示从(i,j)出发的最长递增路径长度
- 对于每个方向,如果相邻单元格值大于当前值,则递归计算
- 取四个方向的最大值+1作为当前结果
- 使用memo数组缓存计算结果
2.3 代码实现
python复制def longestIncreasingPath(matrix):
if not matrix: return 0
m, n = len(matrix), len(matrix[0])
memo = [[0]*n for _ in range(m)]
directions = [(0,1),(1,0),(0,-1),(-1,0)]
def dfs(i,j):
if memo[i][j] != 0:
return memo[i][j]
max_len = 1
for dx, dy in directions:
x, y = i+dx, j+dy
if 0<=x<m and 0<=y<n and matrix[x][y]>matrix[i][j]:
max_len = max(max_len, 1+dfs(x,y))
memo[i][j] = max_len
return max_len
return max(dfs(i,j) for i in range(m) for j in range(n))
2.4 复杂度分析
时间复杂度:O(mn),每个单元格只计算一次
空间复杂度:O(mn),用于存储memo数组
3. 2026/3/24 题目详解:狒狒吃香蕉问题
3.1 问题描述
狒狒喜欢吃香蕉。有N堆香蕉,第i堆有piles[i]根香蕉。警卫将在H小时后回来。狒狒可以决定吃香蕉的速度K(根/小时)。每个小时,她选择一堆香蕉,吃掉其中的K根。如果这堆香蕉少于K根,她会全部吃完,并且这一小时内不会再吃其他香蕉。求狒狒可以在H小时内吃完所有香蕉的最小K。
示例:
输入:piles = [3,6,7,11], H = 8
输出:4
3.2 解题思路
这道题是典型的二分查找应用。我们需要在可能的K值范围内(1到max(piles))找到满足条件的最小K。
判断条件:
对于给定的K,计算吃完所有香蕉所需的总时间是否≤H
3.3 代码实现
python复制def minEatingSpeed(piles, H):
left, right = 1, max(piles)
def canFinish(K):
time = 0
for p in piles:
time += (p + K - 1) // K # 等价于math.ceil(p/K)
return time <= H
while left < right:
mid = (left + right) // 2
if canFinish(mid):
right = mid
else:
left = mid + 1
return left
3.4 复杂度分析
时间复杂度:O(nlogm),其中n是piles长度,m是最大堆的大小
空间复杂度:O(1)
4. 2026/3/25 题目详解:状态压缩的动态规划
4.1 问题描述
给定一个无向图,求访问所有节点的最短路径。你可以从任何节点开始和结束,可以多次访问节点。
示例:
输入:graph = [[1,2,3],[0],[0],[0]]
输出:4 (路径可以是1→0→2→0→3)
4.2 解题思路
这道题需要使用状态压缩技巧来表示已经访问过的节点集合。我们可以用一个整数的二进制位来表示节点访问状态。
核心步骤:
- 使用mask表示已访问的节点集合(第i位为1表示节点i已访问)
- 定义dp[mask][u]表示在状态mask下,当前位于节点u的最短路径
- 使用BFS进行状态转移
4.3 代码实现
python复制def shortestPathLength(graph):
n = len(graph)
target = (1 << n) - 1
queue = collections.deque()
visited = [[False]*(1<<n) for _ in range(n)]
for i in range(n):
queue.append((i, 1<<i))
visited[i][1<<i] = True
step = 0
while queue:
size = len(queue)
for _ in range(size):
u, mask = queue.popleft()
if mask == target:
return step
for v in graph[u]:
new_mask = mask | (1<<v)
if not visited[v][new_mask]:
visited[v][new_mask] = True
queue.append((v, new_mask))
step += 1
return -1
4.4 复杂度分析
时间复杂度:O(n^2 * 2^n)
空间复杂度:O(n * 2^n)
5. 2026/3/26-29 题目快速解析
5.1 3/26 二叉树的最大路径和
核心技巧:后序遍历,计算包含当前节点的最大路径和时,需要考虑左子树、右子树和当前节点的组合。
5.2 3/27 字符串解码
使用栈来处理嵌套结构,遇到'['时压栈,遇到']'时出栈。
5.3 3/28 会议室II
最小堆的应用,按照会议开始时间排序,堆中保存当前进行中的会议的结束时间。
5.4 3/29 滑动窗口最大值
使用双端队列维护一个单调递减队列,队首元素即为当前窗口最大值。
6. 刷题经验与技巧分享
6.1 如何高效利用每日一题
- 定时完成:建议固定时间段(如早晨)完成当日题目
- 记录思路:用注释或笔记记录解题思路,方便回顾
- 多种解法:尝试用不同方法解决同一问题
- 错题本:记录做错的题目,定期复习
6.2 常见问题与解决方法
问题:遇到新题型没有思路
解决方法:先尝试暴力解法,再思考优化方向
问题:总是超时
解决方法:分析时间复杂度,寻找不必要的计算
问题:边界条件考虑不全
解决方法:先写测试用例,包括极端情况
6.3 个人刷题心得
我从2023年开始坚持每日一题,最大的收获不是算法能力的提升,而是养成了持续学习的习惯。建议新手:
- 不要追求数量,要理解每道题的解法
- 定期复习做过的题目
- 参加周赛锻炼实战能力
- 结合实际项目思考算法应用场景
坚持三个月后,你会明显感觉到编码思维的改变。算法题锻炼的不是记忆能力,而是问题分析和解决的能力。
