1. 项目概述
今天要和大家分享的是力扣(LeetCode)上两个经典算法题的解题思路和实现细节——"最大子数组和"与"合并区间"。这两个问题分别来自动态规划和区间处理的常见题型,在面试中出现的频率相当高。我自己在准备面试时反复刷过多次,也总结出了一些实用的解题技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最大子数组和问题解析
2.1 问题描述
给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组[4,-1,2,1]的和最大,为6。
2.2 解题思路
这个问题最直观的解法是暴力枚举所有可能的子数组,计算它们的和,然后取最大值。但这种方法的时间复杂度是O(n²),对于大规模数据效率太低。
更优的解法是使用Kadane算法,这是一种典型的动态规划解法。其核心思想是:
- 维护两个变量:当前子数组和(current_sum)和最大子数组和(max_sum)
- 遍历数组时,对于每个元素,决定是将其加入当前子数组,还是以该元素为起点开始新的子数组
2.3 代码实现
python复制def maxSubArray(nums):
current_sum = max_sum = nums[0]
for num in nums[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)
return max_sum
2.4 复杂度分析
- 时间复杂度:O(n),只需要遍历一次数组
- 空间复杂度:O(1),只使用了常数个额外空间
2.5 注意事项
- 初始值的设置很重要,应该将current_sum和max_sum都初始化为第一个元素的值
- 遍历应该从第二个元素开始
- 对于全负数数组,算法也能正确处理,返回最大的那个负数
3. 合并区间问题解析
3.1 问题描述
以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组。
示例:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间[1,3]和[2,6]重叠,合并为[1,6]
3.2 解题思路
解决这个问题的关键在于:
- 首先按照区间的起始位置进行排序
- 然后遍历排序后的区间列表,逐个合并重叠的区间
3.3 代码实现
python复制def merge(intervals):
if not intervals:
return []
# 按区间的起始位置排序
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
for current in intervals[1:]:
last = merged[-1]
if current[0] <= last[1]: # 有重叠
last[1] = max(last[1], current[1])
else:
merged.append(current)
return merged
3.4 复杂度分析
- 时间复杂度:O(nlogn),主要是排序的时间复杂度
- 空间复杂度:O(logn)或O(n),取决于排序算法的实现
3.5 常见错误
- 忘记处理空输入的情况
- 没有先对区间进行排序
- 合并时只比较了当前区间的开始和上一个区间的结束,而忽略了当前区间的结束可能比上一个区间的结束更大
4. 解题技巧与心得
4.1 最大子数组和问题
- 理解Kadane算法的核心思想:局部最优和全局最优的维护
- 可以尝试将问题分解为子问题:以每个位置为结尾的最大子数组和是多少
- 对于变种问题,如需要返回子数组本身而不仅仅是和,可以额外记录起始和结束位置
4.2 合并区间问题
- 排序是解决区间问题的常见预处理步骤
- 合并时要注意区间的完全包含情况
- 可以画图辅助理解,将区间在数轴上表示出来更直观
4.3 刷题建议
- 对于每个问题,先尝试自己思考解法,不要直接看答案
- 理解算法后,尝试自己实现,而不仅仅是看懂别人的代码
- 多做几次,直到能够独立写出无bug的代码
- 记录下自己的思考过程,这对面试时的解题讲解很有帮助
5. 扩展思考
这两个问题看似简单,但都体现了重要的算法思想:
- 最大子数组和展示了动态规划的思想
- 合并区间展示了贪心算法的应用
在实际工程中,这些算法思想有很多应用场景:
- 金融分析中的最大收益计算
- 日程安排中的时间区间合并
- 资源分配中的最优解寻找
我个人的体会是,刷题不仅要追求数量,更要深入理解每个问题背后的算法思想。这样在遇到新问题时,才能灵活运用这些思想来解决问题。
