前言
每日一题,开心每一天。
一、题链接
二、题意
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
三、题解代码
下面展示一些 内联代码片
。
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize <= 2) {
return numsSize;
}
int slow = 2, fast = 2;
while (fast < numsSize)
{
if (nums[slow - 2] != nums[fast]) {
nums[slow] = nums[fast];
++slow;
++fast;
}
else
{
++fast;
}
}
return slow;
}
四、题解思路
slow=2,fast=2.
一、由题意,要在原数组删除重复的数字,我们可以用两个数组下标,,慢下标nums[slow],快下标nums[fast]。
二、又因为是删除出现两次以上的数子,我们可以在弄一个nums[slow-2],比较nums[slow-2]和nums[fast]
例子:
int nums[]={1,1,1,2,2,3};
情况一:
前三个相同,所以用slow-2和slow,因为只要删除出现两个相同的数字。
slow下标指向要换的数字,用fast下标的数字赋值。
可能有人会问,为什么用slow-2而不用另外一个名字来表示开头下标呢?
因为要保证slow下标和slow-2下标相隔一个元素,这样就可以保证在slow-2下标元素和fast下标元素相同的时候,slow下标元素是要删除的。
最后要返回新数组的长度,虽然slow下标指向最后一个元素,但是其返回的数是其下标。
情况二:
int nums[]={1,1,2,2,2,3}
也一样。
总结
今天到这了,还有其他题解的欢迎留言,共同学习啦。