返回

LeetCode 26. 删除排序数组中的重复项:高效优化指南

闲谈

算法详解:双指针逐个击破

为了解决这个问题,我们引入了一种名为 "双指针" 的算法。双指针算法的核心思想是使用两个指针来遍历数组,一个指针负责跟踪当前扫描的位置,另一个指针负责标记重复元素的位置。具体步骤如下:

  1. 初始化两个指针: 一个指针 slow 指向数组的第一个元素,另一个指针 fast 指向数组的第二个元素。
  2. 比较当前元素与前一个元素: 如果 fast 指向的元素与 slow 指向的元素相等,则说明找到了一个重复元素。
  3. 如果当前元素与前一个元素不相等, 则将 slow 指向的元素的值复制到 fast 指向的元素的位置,然后将 fast 指向下一个元素。
  4. 重复步骤 2 和步骤 3, 直到 fast 指向数组的最后一个元素。

通过这种方式,我们就可以在原数组上删除重复元素,同时保证空间复杂度为 O(1)

编程语言实现:C++、Python 和 Java

int removeDuplicates(vector<int>& nums) {
  int slow = 0;
  int fast = 1;
  while (fast < nums.size()) {
    if (nums[fast] != nums[slow]) {
      nums[++slow] = nums[fast];
    }
    fast++;
  }
  return slow + 1;
}
def removeDuplicates(nums):
  slow = 0
  fast = 1
  while fast < len(nums):
    if nums[fast] != nums[slow]:
      slow += 1
      nums[slow] = nums[fast]
    fast += 1
  return slow + 1
public int removeDuplicates(int[] nums) {
  int slow = 0;
  int fast = 1;
  while (fast < nums.length) {
    if (nums[fast] != nums[slow]) {
      nums[++slow] = nums[fast];
    }
    fast++;
  }
  return slow + 1;
}

结语

通过本文,我们深入探讨了 LeetCode 的第 26 道题——删除排序数组中的重复项。我们详细讲解了双指针算法的原理,并提供了多种编程语言的代码示例。希望这些内容能够帮助您更好地理解这一算法,并轻松解决相关编程问题。