80. 删除有序数组中的重复项 II - 力扣(LeetCode) (leetcode-cn.com)
实现这道题有一个简单版本,目的是N个重复的数只留下一个,建议了解这个简单版后再看这篇文章;
改成两个其实也”很好解决“,思路是双指针算法,具体步骤如下:
1:i代表往前走的指针,j为预定指针,ne记录最近一次满足nums[i]!=nums[i+1]的i位置;
2:如果发现nums[i]!=nums[i+1]的情况,则判断i-ne+1>=2是否成立,如果成立则让j走两步,否则走一步。
如此循环当i<nums.size()-1为true时跳出循环,为了消除边界问题,所以我们在进行循环前在nums后面加上一个足够大的数。
注意,这里的在满足nums[i]!=nums[i+1]时i与ne下标围成的区间刚好时一片连续相等的区间。
下面是具体代码
class Solution {public: int unique(vector<int> &nums){ int i,j,ne; for(i=0,j=0,ne=0;i<nums.size();i++){ if(nums[i]!=nums[i+1]){ if(i-ne+1>=2){ for(int k=j;k<j+2;k++) nums[k]=nums[i]; j+=2; } else nums[j++]=nums[i]; ne=i+1; } } return j; } int removeDuplicates(vector<int>& nums) { nums.push_back(0x3f3f3f3f); int len=unique(nums); return len; }};