RemoveDuplicates::clearDuplicates(vector<int>& nums)
{
/**方法一:暴力法
* 从前往后遍历行不通,考虑从后往前遍历,遇到重复项可以直接length - 1并舍弃。
* 0 0 1 1 1 2 2 2 length = 8
* 0 0 1 1 1 2 2 length - 1 = 7 && num[7] = num[8]
* 0 0 1 1 1 2 length - 1 = 6 && num[6] = num[7]
* 0 0 1 1 1 2 不做处理
* 0 0 1 1 2 length - 1 = 5 && num[5] = num[6]
* 0 0 1 2 length - 1 = 4 && num[4] = num[5]
* 0 0 1 2 不做处理
* 0 1 2 length - 1 = 3 && num[3] = num[4] && num[2] = num[3]
*/
int length = nums.size();
if(nums.size() == 0) return 0;
for(int i = nums.size() - 1; i > 0; i--)
{
if(nums[i] == nums[i - 1])
{
length--;
for(int j = i - 1; j < nums.size(); j++)
{
nums[j] = nums[j + 1];
}
}
}
return length;
}
RemoveDuplicates::easy_clearDuplicates(vector<int>& nums)
{
/**
* 简单法:暴力法容易想到,但是只能击败4%的玩家,每次遇到重复项,其后所有的元素都要移动。
* 采用快指针与慢指针结合的方法:
* 快指针:可以跳过重复元素项,慢指针一点点的移动
* 这种方法击败了全国40%的玩家。
* 0 1 1 1 1 1 2 2
*/
int length = 1;
int j = 1; //快指针
int i = 0; //慢指针
while(j != nums.size()) //快指针从第二个元素开始,遍历后面所有元素。
{
if(nums[j] == nums[i]) //若快指针当前指向元素与慢指针指向的元素相同
{
j++; //保持慢指针的位置,快指针++
}else //若快指针当前指向元素与慢指针指向的元素不同
{
i++; //慢指针向后挪一位
nums[i] = nums[j]; //慢指针当前元素等于快指针当前元素
j++; //快指针++
}
}
return i + 1;