1. LeetCode Hot 100 普通数组专题解析
作为一名刷过300+题的LeetCode老手,我深刻理解普通数组类题目在面试中的高频出现率。数组作为最基础的数据结构,其相关题目往往能考察候选人对边界条件处理、时间复杂度优化和空间复杂度权衡的能力。本文将针对Hot 100中的普通数组题目,从解题思路、代码实现到优化技巧进行全方位拆解。
数组题目的核心在于掌握几种经典解题范式:
- 双指针技巧(快慢指针、左右指针)
- 前缀和与差分数组
- 滑动窗口算法
- 原地修改(in-place操作)
2. 高频题目深度剖析
2.1 最大子数组和(第53题)
这道题要求找出数组中连续子数组的最大和,是考察动态规划的经典题目。最优解法采用Kadane算法,时间复杂度O(n),空间复杂度O(1)。
def maxSubArray(nums): max_current = max_global = nums[0] for num in nums[1:]: max_current = max(num, max_current + num) max_global = max(max_global, max_current) return max_global关键点:当max_current为负数时,直接舍弃前面的累加结果,从当前元素重新开始计算。
2.2 合并区间(第56题)
这道题考察对区间的处理和排序算法的应用。解题步骤:
- 按区间起始点排序
- 初始化结果列表
- 遍历区间,合并重叠部分
def merge(intervals): intervals.sort(key=lambda x: x[0]) merged = [] for interval in intervals: if not merged or merged[-1][1] < interval[0]: merged.append(interval) else: merged[-1][1] = max(merged[-1][1], interval[1]) return merged2.3 旋转图像(第48题)
这道二维数组题目要求原地旋转n×n矩阵。解题关键是找到旋转前后位置的映射关系:
matrix[row][col] → matrix[col][n-row-1]最优解法是先转置矩阵,再水平翻转每一行:
def rotate(matrix): n = len(matrix) # 转置 for i in range(n): for j in range(i, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] # 水平翻转 for row in matrix: row.reverse()3. 解题技巧与优化策略
3.1 双指针的灵活运用
双指针技巧在数组题目中应用广泛,主要有两种形式:
- 快慢指针:解决删除重复元素等问题
- 左右指针:解决两数之和、盛水容器等问题
以删除排序数组中的重复项为例:
def removeDuplicates(nums): if not nums: return 0 slow = 0 for fast in range(1, len(nums)): if nums[fast] != nums[slow]: slow += 1 nums[slow] = nums[fast] return slow + 13.2 空间复杂度的优化
很多数组题目可以通过原地修改来优化空间复杂度。例如第238题"除自身以外数组的乘积",要求不使用除法且在O(1)空间复杂度内完成(输出数组不计入空间复杂度)。
def productExceptSelf(nums): n = len(nums) result = [1] * n # 从左到右计算左侧乘积 for i in range(1, n): result[i] = result[i-1] * nums[i-1] # 从右到左计算右侧乘积并合并 right = 1 for i in range(n-1, -1, -1): result[i] *= right right *= nums[i] return result4. 常见错误与调试技巧
4.1 边界条件处理
数组题目最容易出错的地方就是边界条件。常见问题包括:
- 空数组处理
- 单元素数组处理
- 索引越界
- 循环终止条件
以二分查找为例,正确的循环条件应该是left <= right而非left < right,否则会漏掉某些情况。
4.2 测试用例设计
设计全面的测试用例是保证代码正确性的关键。对于数组题目,应该考虑:
- 空数组
- 单元素数组
- 全相同元素数组
- 已排序数组
- 完全逆序数组
- 包含重复元素的数组
5. 刷题建议与学习路径
对于数组类题目,建议按照以下顺序进行系统学习:
- 先掌握基础操作(遍历、查找、插入、删除)
- 学习经典算法(双指针、滑动窗口等)
- 练习中等难度题目
- 挑战hard题目
我个人在刷题过程中发现,记录错题本并定期复习比盲目刷题更有效。对于每道做错的题目,应该分析:
- 错误原因
- 正确解法思路
- 可以优化的地方
- 类似题目对比
数组作为最基础的数据结构,其相关题目往往能反映出一个程序员的编码基本功。通过系统性地练习Hot 100中的数组题目,不仅可以提升面试通过率,更能培养出解决实际工程问题的思维能力。