跳到主要内容

删除有序数组中的重复项

· 阅读需 3 分钟
Eureka X
Mr.Nobody

力扣面试经典——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. 初始化慢指针指向数组第一个元素位置
  2. 快指针从第二个元素开始遍历整个数组
  3. 当快指针元素与慢指针元素不相等时,将快指针元素复制到慢指针下一个位置
  4. 返回慢指针位置加1即为新数组长度

3️⃣ 关键点解析

🎯 代码技巧

  • 快慢指针的经典应用
  • 利用数组已排序特性,只需比较相邻不同元素
  • slow 指针既作为索引又作为计数器

4️⃣ 使用场景

✅ 适用情况:

  • 有序数组去重操作
  • 保留唯一元素并维持原有顺序
  • 类似问题:删除重复元素II、移除元素等

⚠️ 前提条件:

  • 数组必须是排序的(非严格递增)
  • 只关心前k个元素,其余位置内容无关紧要

5️⃣ 复杂度分析

  • ⏱️ 时间复杂度:O(n),只需要遍历数组一次

  • 💾 空间复杂度:O(1),只使用了常数个额外变量

6️⃣ 注意事项

🚩 边界情况:

  • 空数组或单元素数组:numsSize <= 1
  • 所有元素都相同
  • 所有元素都不相同

💥 易错点:

  • 忘记处理边界条件(如果题目没有保证数组非空)
  • 返回值应该是 slow + 1 而不是 slow
  • 没有正确理解"原地"的含义
  • 快指针起始位置应该是1而不是0
加载评论中...