一个有序数组nums,删除重复出现的元素,使得每一个元素只出现一次,返回删除后数组的长度
要求:不能使用额外的数组空间(别想用Set),必须在原地删除并使得在O1额外的空间下完成
例如:
输入:【0,1,2,2,3,3,4】
输出:5
利用双指针算法,i作为慢指针,其下标+1为不重复元素个数,j作为快指针一致遍历到头。开始阶段,i=0,j=1;如果两个下标对应的元素不同,则i++,j++。如果遇到相同,则i+1对应的元素=j对应的元素。j作为快指针一直向后走,i作为慢指针只有满足 nums[ i ] != nums[ j ] 的时候才进行++。
代码如下:
public class SortedArrayDuplicates {
public static void main(String[] args) {
System.out.println(removeDuplicates(new int[]{0,1,2,2,3,3,4}));
}
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;
}
}
结果: