题目80. 删除有序数组中的重复项 II:
题解:
双指针,l表示当前真实填充位置, r表示目前探测位置
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//cur为目前l所在位置的数值,count为计数
int l = 0, r = 0, cur = 10001, count = 0, n = nums.size();
if(n<=2){return n;}
while(r < n)
{
//把探测位置赋值给真实位置
nums[l] = nums[r];
//当真实数值等于cur,计数+1
if(cur == nums[l])
{
count++;
//当cur得计数大于2
if(count > 2)
{
//找到下一个不等于该数的位置
while(r < n && nums[r]==cur )
{
r++;
}
//如果直接到了末尾,直接返回当前l
if(r == n){return l;}
//否则cur更新为探测数字
cur = nums[r];
count = 0 ;
}
//计数小于2,l和r都+1
else
{
l++;r++;
}
}
//如果真实数值不等于cur,更新cur
else
{
cur = nums[l];
count = 0;
}
}
//返回目前真实数值位置,此为真实长度+1得位置
return l;
}
};
或者
或
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n <= 2) { // 特殊判断,如果nums长度小于2,直接输出长度n即可
return n;
}
int slow = 2, fast = 2; // 因为上面已经做过特殊判别,所以这里快慢指针从2开始
while (fast < n) {
if (nums[slow - 2] != nums[fast]) {
// 因为题目要求最多两个数相同,所以这么判断
// 如果nums[slow - 2] == nums[fast],代表已经有两个数相等,
// 此时nums[fast]对应的数值不能放进结果之中。
//反之,如果nums[slow - 2] != nums[fast],
// 那么nums[fast]可以放进nums[slow]中,并且slow++,记录结果的长度。
nums[slow] = nums[fast];
slow++;
}
fast++; // 不管怎么样,快指针都是要向前遍历各个元素的
}
return slow; // 返回结果的长度,即slow
}
};
题目26. 删除有序数组中的重复项:
题解:
同上
代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int l = 1, r = 1, n = nums.size();
if(n<2){return n;}
while(r<n)
{
if(nums[l-1] != nums[r])
{
nums[l] = nums[r];
l++;
}
r++;
}
return l;
}
};