题目:26、删除有序数组中的重复项
目录

方法①-遍历删除
思路:由于数组原先是有序的,那么就可以遍历数组,找相邻两个数是否相等;
如果相等就把数组后面的元素往前移动;
int removeDuplicates(int* nums, int numsSize)
{
for(int i = 0;i<numsSize-1;i++)
{
//如果相邻的元素相等,那么就后面覆盖前面的元素
if(nums[i] == nums[i+1])
{
for(int j = i;j<numsSize-1;j++)
{
nums[j] = nums[j+1];
}
numsSize--; //覆盖结束后,数组元素个数-1
i--; //更新下标
}
}
return numsSize;
}
方法②-以空间换时间
思路:开辟额外空间tmp,用来保存只出现过一次的数字,就像相当于移除了重复元素;
时间复杂度:O(n);
空间复杂度:O(n);
int removeDuplicates(int* nums, int numsSize)
{
//假如数组没有元素,直接返回0
if(numsSize == 0)
return 0;
int* tmp = (int*)malloc(sizeof(int)*numsSize);
//先给临时数组一个值
tmp[0] = nums[0];
int cur = 0; //指向临时数组的下标
//从nums[1]开始与临时数组的元素比较,不相同的直接放进去tmp
for(int i = 1;i<numsSize;i++)
{
if(nums[i] == tmp[cur])
{
continue;
}
else
{
tmp[++cur] = nums[i]; //注意控制下标
}
}
//将临时数组拷回去
for(int i = 0;i<cur+1;i++)
{
nums[i] = tmp[i];
}
return cur+1;
}
方法③-双指针
思路:用src = 1;dst = 0; 指向nums数组下标;
只要nums[src] != nums[dst] ;那么就把 src对应的值赋值给dst+1的位置;同时src++;
只要nums[src] 等于 nums[dst],那么就移动src++;
int removeDuplicates(int* nums, int numsSize){
int src = 0,dst = 0;
while(src < numsSize)
{
if(nums[src] == nums[dst])
{
src++;
}
else
{
dst++;
nums[dst] = nums[src];
src++;
}
}
return dst+1;
}