题目
给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成.
分析
根据上面的题目,可以得出三个条件:
- 数组nums是一个升序的数组;
- 每个元素只出现一次,删除重复出现的元素;
- 原地删除,空间复杂度为O(1);
- 返回删除后数组的长度;
思路
- ①比较prev和cur指向的数字是否相等;
//定义三个变量,分别代表前一个位置,后一个位置,数组下标
int prev=0,cur=1,dst=0;
nums[prev]?=nums[cur];//判断两个数值是否相等,此处写得不是程序设计语言;
- ②若不相等,nums[dst]=nums[prev],prev++,cur++,dst++分别指向下两个相邻数字;
if(nums[prev]!=nums[cur])
{
nums[dst]=nums[prev];
prev++;
cur++;
dst++;
}
- ③若相等,prev++,cur++,比较下两个相邻的数字是否相等;
else
{
prev++;
cur++;
}
- ④重复②③步骤,直至cur>numsSize(数组的下标);
- ⑤当cur>numsSize时,无论nums[prev]与nums[cur]是否相等,都会有nums[dst]=nums[prev];
==nums[dst]=nums[prev];
dst++;//数组的长度
代码
int removeDuplicates(int* nums, int numsSize){
int prev=0,cur=1,dst=0;//prev是指前面的数,cur是指后面的数,dst是用来存储数组元素
if(numsSize!=0)
{
while(cur<numsSize)
{
if(nums[prev]!=nums[cur])
{
nums[dst]=nums[prev];
dst++;
prev++;
cur++;
}else
{
prev++;
cur++;
}
}
nums[dst]=nums[prev];//在最后的一个数
dst++;//因为是从0开始计数,所以数组的长度需要dst+1;
}
return dst;
}
代码输出结果
输入
[1,1,2]
输出
[1,2]