26.删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组 nums 的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
1 | 输入:nums = [1,1,2] |
示例 2:
1 | 输入:nums = [0,0,1,1,1,2,2,3,3,4] |
解题思路
这是一道经典的双指针题目,考察数组的原地操作。
核心思想
- 使用双指针,一个指针指向当前不重复的位置
- 另一个指针遍历数组寻找不同的元素
- 将不同的元素放到前面
方法一:双指针解法(推荐)
时间复杂度 O(n)、空间复杂度 O(1)
1 | /** |
方法二:优化版本
1 | var removeDuplicates = function(nums) { |
方法三:使用Set(不符合要求,但思路清晰)
1 | var removeDuplicates = function(nums) { |
解题要点
- 原地操作:不能使用额外空间,必须原地修改数组
- 双指针技巧:使用快慢指针,快指针遍历,慢指针记录位置
- 边界处理:空数组和只有一个元素的情况
- 相对顺序:保持元素的相对顺序不变
面试要点
- 高频考点:这道题是面试中的高频题目
- 原地操作:考察对数组原地操作的理解
- 双指针应用:双指针的经典应用场景
- 空间复杂度:要求O(1)空间复杂度
相关题目
- 80.删除有序数组中的重复项 II - 进阶版本
- 27.移除元素 - 类似的数组操作
- 283.移动零 - 数组元素移动
扩展思考
为什么使用双指针?
- 快指针遍历数组寻找不同元素
- 慢指针记录当前不重复的位置
时间复杂度分析
- 只需要遍历一次数组:O(n)
- 空间复杂度:O(1)
边界情况
- 空数组:返回0
- 只有一个元素:返回1
- 所有元素相同:返回1
算法正确性
- 保证相对顺序不变
- 原地修改数组
- 返回正确的长度
最后更新: 2021-09-05