给你一个排好序的数组,删除重复的元素,使得每一个仅出现一次,返回新数组的长度。
不能为另一个数组分配额外的空间,你必须通过修改输入数组来完成。要求空间复杂度为O(1)。
1. 常规思路
因为该数组已经排好序了,比较相邻元素是否相同,如果不相同就放到原数组中。
public int removeDuplicates(int[] nums){
int j = 0;
if (nums.length == 0)
{
return 0;
}
nums[j] = nums[0];
for (int i=1; i<nums.length; i++)
{
if (nums[i] != nums[i-1])
nums[++j] = nums[i];
}
return j+1;
}
2. 双指针法
我们可以使用两个指针i和j,j的移动速度比i稍快。只要nums[i] = nums[j], 我们就增加下标j,跳过重复元素。
当碰到nums[i] != nums[j]时,将i的下标增加1,拷贝nums[j]到nums[i],如此执行,直到数组的末尾。
public 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;
}