返回

有序数组中的重复元素——如何巧妙删除?

后端

我们经常需要处理有序数组,特别是在数据分析、排序算法和数据库查询等领域。然而,这些有序数组中可能存在重复项,这会给我们的处理带来麻烦。为了解决这个问题,我们需要一种有效且巧妙的方法来删除重复项。

一、题目概述:

力扣题号:80

难度等级:中等

题目

给定一个有序数组,请删除其中的重复项,使得每个元素只出现一次,且保持元素的相对顺序不变。

二、巧妙解决:

  1. 双指针法:

双指针法是一种常见的数组处理技巧,它使用两个指针分别指向数组中的两个元素。

  • 首先,我们将两个指针都指向数组的第一个元素。
  • 然后,我们开始遍历数组,如果当前元素与前一个元素不同,则我们将当前元素复制到新数组中,并移动新数组的指针。
  • 如果当前元素与前一个元素相同,则我们移动当前元素的指针,直到遇到一个与前一个元素不同的元素。
  1. 辅助数组法:

辅助数组法是一种更简单的删除重复项的方法,但它需要额外的空间。

  • 首先,我们将一个布尔数组初始化为False,数组长度与给定数组相同。
  • 然后,我们遍历给定数组,如果当前元素在布尔数组中标记为True,则我们跳过该元素。
  • 如果当前元素在布尔数组中标记为False,则我们将该元素复制到新数组中,并在布尔数组中将该元素标记为True。

三、代码示例:

C++:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }

        int slow = 0;
        for (int fast = 1; fast < n; fast++) {
            if (nums[fast] != nums[slow]) {
                nums[++slow] = nums[fast];
            }
        }

        return slow + 1;
    }
};

Java:

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }

        int slow = 0;
        for (int fast = 1; fast < n; fast++) {
            if (nums[fast] != nums[slow]) {
                nums[++slow] = nums[fast];
            }
        }

        return slow + 1;
    }
}

Python:

def removeDuplicates(nums):
    n = len(nums)
    if n == 0:
        return 0

    slow = 0
    for fast in range(1, n):
        if nums[fast] != nums[slow]:
            nums[slow + 1] = nums[fast]
            slow += 1

    return slow + 1

四、总结:

删除有序数组中的重复项是一个常见的问题,我们可以使用双指针法或辅助数组法来解决。双指针法不需要额外的空间,但需要更多的操作。辅助数组法需要额外的空间,但操作更简单。我们可以根据具体情况选择合适的方法。