一 先看题目
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
二 分析要求
1.1原地:
如果没有这个要求,就可以采用创建临时数组的方式:
创建两个指针,一前一后遍历数组,创建一个临时数组和管理它的指针。
1.若src1 等于 src2 :
src2后移一个单位
2.若src1 不等于 src2 :
①把nums数组src1位置的值赋给tmp数组的dst位置
②src1移动到src2位置
③src2后移一个单位
④dst后移一个单位
int removeDuplicates(int* nums, int numsSize) {
int src1 = 0;
int src2 = 1;
int tmp[10] = { 0 };
int dst = 0;
while (numsSize--)
{
if (nums[src1] != nums[src2])
{
tmp[dst++] = nums[src1];
src1 = src2++;
}
if (nums[src1] == nums[src2])
src2++;
}
return dst;
}
时间复杂度:O(N)
空间复杂度:O(N)
三 较佳解法:快慢指针
对1.1进行优化,直接在原数组上修改
1.创建两个指针,都指向起始位置
2.src和dst指向的位置
相同:src后移一个单位
不同:dst后移一个单位,再把src指向位置的值赋给dst
3.最后dst+1就是不同元素的个数
int removeDuplicates(int* nums, int numsSize) {
int src = 0;
int dst = 0;
while(src < numsSize)
{
if(nums[src] != nums[dst])
{
nums[++dst] = nums[src++];
}
else
src++;
}
return dst+1;
}
时间复杂度:O(N)
空间复杂度:O(1)