删除有序数组中的重复项
· 阅读需 3 分钟
力扣面试经典——26题
💡 参考代码:
/**
* 删除排序数组中的重复项
*
* @param nums 排序数组指针,用于原地删除重复元素
* @param numsSize 数组长度
* @return 返回删除重复元素后数组的新长度
*
* @description 使用双指针法原地删除重复元素,保持元素相对顺序不变
* 时间复杂度: O(n)
* 空间复杂度: O(1)
*/
int removeDuplicates(int* nums, int numsSize) {
int slow = 0; // 慢指针,指向不重复元素的当前位置
// 快指针遍历整个数组,从第二个元素开始
for (int fast = 1; fast < numsSize; fast++) {
// 当快指针指向的元素与慢指针指向的元素不相等时
if (nums[fast] != nums[slow]) {
// 将慢指针前移一位,并将快指针元素复制到该位置
nums[++slow] = nums[fast];
}
}
return slow + 1; // 返回不重复元素的个数
}
📖 总结:
点击展开题目总结
🤔 删除有序数组中的重复项
1️⃣ 题目核心信息
🎯 功能描述:原地删除非严格递增排列数组中的重复元素,使每个元素只出现一次
📥 输入输出:
- 输入:非严格递增排列数组
nums、数组长度numsSize - 输出:删除重复元素后数组的新长度,并保证前k个元素为唯一元素
2️⃣ 实现原理
💡 核心思路:使用快慢双指针技术,快指针遍历数组,慢指针记录不重复元素位置
📋 实现步骤:
- 初始化慢指针指向数组第一个元素位置
- 快指针从第二个元素开始遍历整个数组
- 当快指针元素与慢指针元素不相等时,将快指针元素复制到慢指针下一个位置
- 返回慢指针位置加1即为新数组长度
3️⃣ 关键点解析
🎯 代码技巧
- 快慢指针的经典应用
- 利用数组已排序特性,只需比较相邻不同元素
slow指针既作为索引又作为计数器
4️⃣ 使用场景
✅ 适用情况:
- 有序数组去重操作
- 保留唯一元素并维持原有顺序
- 类似问题:删除重复元素II、移除元素等
⚠️ 前提条件:
- 数组必须是排序的(非严格递增)
- 只关心前k个元素,其余位置内容无关紧要
5️⃣ 复杂度分析
-
⏱️ 时间复杂度:O(n),只需要遍历数组一次
-
💾 空间复杂度:O(1),只使用了常数个额外变量
6️⃣ 注意事项
🚩 边界情况:
- 空数组或单元素数组:
numsSize <= 1 - 所有元素都相同
- 所有元素都不相同
💥 易错点:
- 忘记处理边界条件(如果题目没有保证数组非空)
- 返回值应该是
slow + 1而不是slow - 没有正确理解"原地"的含义
- 快指针起始位置应该是1而不是0
加载评论中...
