
代码1给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
原题链接
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 --;
i --;
}
}
return numsSize;
}
代码2
最终的结果数组比原数组要小,因此直接将留下来的元素覆盖存储在数组前段。
可以利用双指针算法,一个“快指针”,一个“慢指针”。
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0) return 0; //特判
int i = 0;
for (int j = 1; j < numsSize; j ++) //从第2个元素开始判断,若与前一个元素不同,则保存到前面
if (nums[j] != nums[j - 1]) nums[++ i] = nums[j]; //存储到数组前段
return i + 1;//i即数组长度
}
另一种写法:
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0) return 0;
int i = 0;
for (int j = 0; j < numsSize; j ++)
if (nums[j] != nums[i]) nums[++ i] = nums[j]; //判断是否与i所指的元素相等
return i + 1;
}
代码1变式:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
原题链接
int removeDuplicates(int* nums, int numsSize)
{
for (int i = 0; i < numsSize - 2; i ++)
{
if (nums[i] == nums[i + 1] && nums[i + 1] == nums[i + 2])
{
for (int j = i; j < numsSize - 1; j ++) nums[j] = nums[j + 1];
numsSize --;
i --; //继续处理
}
}
return numsSize;
}
代码2
“快慢”双指针
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize <= 2) return numsSize;
int i = 0;
for (int j = 2; j < numsSize; j ++)
{
if (nums[i] != nums[j])
{
nums[i + 2] = nums[j];
i ++;
}
}
return i + 2;
}