从排序数组中删除重复项
给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。
不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。
示例:
给定数组: nums = [1,1,2], 你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2 不需要理会新的数组长度后面的元素
思路:
1.空间复杂度要求O(1),所以不能通过复制新数组来解决。
可以使用双指针法。一前一后(记为 pre ,cur),cur比pre提前,cur 和 pre指向的内容不同则同时向前走一步,否则只有cur向前直到cur 和 pre指向的内容不同,此时将cur指向的内容复制到pre+1的位置。依次类推 ,直到cur指向数组结尾为止。代码:
int removeDuplicates(int* nums, int numsSize) {
int *pre = nums,*cur= nums;
int length=1,i;
if(numsSize<2){
return numsSize;
}
for(i=0;i<numsSize;i++){
if(*pre != *cur){
pre++;
*pre = *cur;
length++;
}
cur++;
}
return length;
}