问题描述
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度2
,并且原数组 nums 的前两个元素被修改为1
,2
。
不需要考虑数组中超出新长度后面的元素。示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4]
题目分析
传入的数组是一个单调递增的数组,所以相同的元素都在相邻的位置,在遍历数组的时候记录相同元素的个数,然后从后向前移动数组元素,并修改数组大小。
解决方法
int removeDuplicates(int* nums, int numsSize) {
int count = 0;
int i = 0;
for (i = 1; i < numsSize ; i ++) {
count = 0;
while ( i <= numsSize-1 && nums[i-1] == nums[i] ) {
i++;
count++;
}
if (count > 0)
{
for (int j = i; j < numsSize; j++) {
nums[j - count] = nums[j];
}
}
i = i - count;
numsSize -= count;
}
return numsSize;
}
总结
这道题目的解决方法是线性表的删除,找到要删除的元素的个数,然后从后往前移动元素,最终可以达到删除重复元素的目的,只需从前往后遍历一次就可解决。