所有的方法的思想都是设置两个值,指向不同的元素,当指向的元素相同的时候,前面的指向不变,后面的指向向后移动,当指向的元素不相同的时候,前面的指向往后移动一位,后面的指向赋值给移动完后的前面的指向,然后自己再向后移一位。
方法一:指针法
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int * start = &nums[0];
int *end = &nums[1];
int length = 1;
for(int i = 1; i<nums.size() ;i++)
{
if(*start == *end)
end++;
else
{
length++;
start++;
*start = *end;
end++;
}
}
return length;
}
};
方法二:数值指向法
这是第一种方法的稍微优化。执行的速度稍微快于第一种
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int start = 0;
int end = 1;
for(int i = 1; i<nums.size() ;i++)
{
if(nums[start] == nums[end])
end++;
else
{
start++;
nums[start] = nums[end];
end++;
}
}
return start+1;
}
};
方法三:官方法
从第二个元素开始的判定。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
};