算法题 — 删除排序数组中的重复项

问题:一个有序数组 nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。

注:不能使用额外的数组空间,必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

例:
输入:[0, 1, 2, 2, 3, 3, 4]
输出:5

重点考察:双指针算法

有序数组可以放两个指针 i 和 j,其中,i 是慢指针,j 是快指针。

只要 nums[i] != nums[j],i 就继续递增,之后把 nums[j] 赋值给 nums[i](注意,此时的 i 是递增后的 i)。

如果 nums[i] = num[j],j 就继续递增以跳过重复项。直到 nums[i] != nums[j]。

算法题 — 删除排序数组中的重复项_第1张图片

public static void main(String[] args) {
    System.out.println(removeDuplicates(new int[]{0, 1, 2, 2, 3, 3, 4})); // 5
}

public static int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    int i = 0;
    for (int j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

你可能感兴趣的:(算法,java,数据结构)