题目描述:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
实例:
- 实例1:
给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。
- 实例2:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
你不需要考虑数组中超出新长度后面的元素。
解题思路:
k指针所指向位置的数值是没有任何意义的,因为被k指针指向了,说明这是一个“不合法”的位置,最终只能被替换。
在遍历整个数组的时候需要比较数值i与数值i-1,其比较的结果只有两种情况,分为“合法”和“不合法”的情况。
“合法”的情况(如果是“合法”的情况,那么直接将i的值赋给k):
(1)两个数值相同,但是计数器count的值小于2;
(2)两个数值不相同;
“不合法”的情况(如果是“不合法”的情况,那么k指向的位置不变,然后i++):两个数值相同,并且计数器count的值等于2.
AC代码:
int removeDuplicates(int* nums, int numsSize) {
if(numsSize <= 2)//数组中只有两个数或者小于两个数的情况一定是“合法”的,直接返回原数组即可
{
return numsSize;
}
int count = 1;
int k = 1;
for(int i = 1; i < numsSize; i++)
{
if(nums[i] == nums[i - 1])
{
if(count < 2)
{
nums[k++] = nums[i];
count++;
}
}
else
{
count = 1;
nums[k++] = nums[i];
}
}
return k;
}