目录
- 问题描述
- 判题标准
- 示例
- 提示
- 具体思路
- 思路一
- 思路二
- 代码实现
问题描述
给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。然后返回nums中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
- 返回 k 。
题目链接:删除有序数组中的重复项
判题标准
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被通过。
示例
提示
1 <= nums.length <= 3 *
1
0
4
10^4
104
−
1
0
4
-10^4
−104 <= nums[i] <=
1
0
4
10^4
104
nums 已按非严格递增排列
具体思路
思路一
重新额外开辟一个数组存放修改过的元素。使用src1,src2和dst指针,如果src1与src2所指向的内容相等时,那么就src++,如果当src1与src2不相等时,就将a数组中src1中的内容赋值到tmp数组的dst中,让后dst++,然后将src2赋值给src1,最后src2++。
思路二
不需要额外开数组的方法。在一个数组中使用src和dst两个指针,当src和dst不相等时,那么就++dst,然后将数组a中的src的内容赋值到a数组中的dst中,最后在++src,如果当src和dst相等的时候,那么就直接src++。
代码实现
//思路2
int removeDuplicates(int* nums, int numsSize) {
int src = 1, dst = 0;
while(src < numsSize)
{
if(nums[src] != nums[dst])
{
nums[++dst] = nums[src++];
}
else
{
src++;
}
}
return dst+1;
}