删除排序数组中的重复项

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)

    推荐阅读