题目描述:
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。说明:
nums
已按升序排列
解题思路:
- 通常情况下,我们实现删除数组中的重复项常常想到的思路就是重新申请一个数组,然后所给数组,将新数组中没有出现的数记录在新数组中即可。
- 但是题目要求我们在原数组中修改,这种情况,我们可以定义两个变量,一个变量用来遍历数组(j),一个变量用来改变前边重复数组的值(i)
- 当nums[i]和nums[j]相等的时候,j就一直往后边找,直到找到一个和i不相等的值,然后将i+1,将此时j所对应的值赋给i所对应的位置,一直循环,直到j将数组遍历完即可。
- i所对应的位置即为新数组最后一个元素的位置 。我们返回数组长度应返回i+1即可(返回i+1的原因是因为数组下标从0开始)
我们可以画图表示一下上边的文字:
代码实现此题:
#include <stdlib.h>
#include <iostream>
#include <vector>
using namespace std;
//给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
//不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
int removeDuplicates(vector<int>& nums)
{
if (nums.size() == 0)
{
return 0;
}
int i = 0;
for (int j = 1; j < nums.size(); j++)
{
if (nums[j] != nums[i])
{
i++;
nums[i] = nums[j];
}
}
return (i + 1);
}