删除排序数组中的重复项

26. 删除排序数组中的重复项

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

Tips:

  • 不是考虑去将后面所有元素左移,而是考虑Overwrite
  • 不需要担心数组的有序性,完全没有问题
  • writeIndex记录的是下一个需要被覆盖的元素!

更新下通用代码,用更明显的双指针(这里是同向双指针)来写代码,其实前面那个就是双指针,一个是writeIndex,一个是for循环中的变量i

    public int removeDuplicates(int[] nums) {
        if (nums.length == 0 || nums == null) return 0;
        int slow = 0, fast = 1;
        while (fast < nums.length) {
            if (nums[fast] != nums[slow]) {
                nums[++slow] = nums[fast];
            }
            fast++;
        }
        // 长度为索引 + 1
        return slow + 1;
    }

Tips:

  • 我们让慢指针 slow 走左后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是不重复元素,之后的所有元素都是重复元素。(来自labuladong)

你可能感兴趣的:(删除排序数组中的重复项)