【LeetCode】27. 移除元素
解题思路
方法一:双指针法(推荐)
- 核心思想:使用快慢两个指针遍历数组,快指针寻找有效元素,慢指针标记有效位置
- 时间复杂度:O(n) - 单次遍历数组
- 空间复杂度:O(1) - 原地操作
- 优势:保持元素相对顺序,符合题目"顺序可以改变"的要求
方法二:切片法(Go特性)
- 核心思想:利用Go的切片特性进行元素过滤
- 时间复杂度:平均O(n),最坏O(n^2)(多次内存分配)
- 适用场景:对代码简洁性要求高,且元素顺序无关紧要
关键步骤(双指针法)
复杂度分析
| 方法 | 时间复杂度 | 空间复杂度 | 特点 |
|---|---|---|---|
| 双指针法 | O(n) | O(1) | 稳定高效,推荐方案 |
| 切片法 | O(n)~O(n²) | O(1) | 代码简洁,可能触发内存分配 |
完整代码实现
运行示例输出
关键点说明
- 双指针优化:添加
if slow != fast判断,减少不必要的数组写入操作 - 内存管理:切片法会触发内存重新分配,测试时需要复制原数组
- 边界处理:空数组和全删除情况都得到正确处理
- 结果验证:通过检查前k个元素确保正确性,不关心后续元素值
两种方法均可通过LeetCode测试,但推荐使用双指针法以保持最佳性能,特别是在处理大型数组时。切片法虽然代码更简洁,但频繁的切片操作会影响性能。

浙公网安备 33010602011771号