赞
踩
每日一题,开心每一天。
给你一个有序数组 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}
也一样。
今天到这了,还有其他题解的欢迎留言,共同学习啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。