【LeetCode】26. 删除有序数组中的重复项

in #programming5 months ago

1 题目描述

26. 删除有序数组中的重复项要求给定一个非严格递增排列的整数数组 nums,要求原地删除数组中的重复元素,使得每个元素只出现一次,并返回删除重复元素后的数组长度。需要注意的是,元素的相对顺序应保持不变。

2 解题思路

本题的关键在于“原地删除”和“保持相对顺序”。由于数组是非严格递增的,我们可以利用双指针技术来解决这个问题。

  • 左指针 (left):指向当前已知的不同元素的最后一个位置。
  • 右指针 (right):用于遍历数组中的每一个元素。

right 指针所指向的元素与 left 指针所指向的元素不同,说明遇到了一个新的不同的元素。此时我们将 right 指针指向的元素复制到 left 指针后面的位置,并将 left 指针向前移动一位。这样就保证了数组中从头到 left 指针位置的所有元素都是唯一的。

3 Java 代码实现

public class Solution {
    public int removeDuplicates(int[] nums) {
        int left = 0;
        int right = 1;
        for (; right < nums.length; right++) {
            if (nums[left] != nums[right]) {
                nums[++left] = nums[right];
            }
        }
        return left + 1;
    }
}

4 注意事项

  • 双指针:使用双指针技术,其中 left 指针追踪新数组的当前位置,而 right 指针用于遍历整个数组。
  • 原地修改:直接在原数组上进行修改,不需要额外的空间。
  • 返回值:返回 left + 1,即为不重复元素的数量。