题目:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
这个问题很常规,找到一个重复的元素然后把之后的元素前移,接着继续判断,这个算法的复杂度为O(n^2).但是分析一下,把之后又的所有元素前移这个操作是可以优化的,后面的数的位置并没有确定,全部前移没有必要,反而浪费了资源,我们想要的只是把一个合适的数替代这里重复的数,这样就够了。实现也不困难,我们只需要不停向下遍历,把新的不重复的值添加在已知的不重复的值的后面,所以我们需要声明一个int值来标记当前不重复序列的位置。
具体代码参考如下:
class Solution {
public int removeDuplicates(int[] nums) {
// 第一个数肯定不是重复的数,并且作为一个指针来计算不重复的数的个数
int i = 0;
for (int j = 1; j < nums.length; j++) {
// 如果不是重复的数,就将指针 i 后移,同时将不重复的元素分配到指针 i 目前到达的位置
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
// i+1 是因为需要加上第一个不重复的数
return i + 1;
}
}