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)