一个通过的解法如下:
首先判断元素个数是否不少于2个,因为在这样的情况下,无论怎么样nums整个数组都是符合要求的,可以直接返回本身;
对于一般的,首先,我们需要两个变量,一个用于记录被填补的个数cout,一个用于记录前一次的比较结果lastSame(初始化为false,符合策略需求),有如下策略
如果 此次比较的 i 与 i-1 这两个元素相同:
1. 如果上一次比较也是两个元素相同,说明当前的元素i至少是第3个相同的元素,我们可以计数了,即++count;
2. 如果上一次比较是不同的两个元素,这意味着当前的元素i是第二个相同的元素,根据题目要求,这个元素是可以保留的,所以我们不能把它记录在内,而是把它往前移动count这么多个位置。另外lastSame需要更新为true。
如果 此次比较的 i与 i-1 这两个元素不同,那就把这个元素往前挪count这么多个位置
1 class Solution { 2 public: 3 int removeDuplicates(vector<int>& nums) { 4 if (nums.size() < 3) 5 { 6 return nums.size(); 7 } 8 9 int count = 0; 10 bool lastSame = false; 11 for (int i = 1; i < nums.size(); ++i) 12 { 13 if (nums[i] == nums[i-1]) 14 { 15 if (lastSame) 16 { 17 ++count; 18 } 19 else 20 { 21 lastSame = true; 22 if (count) 23 { 24 nums[i - count] = nums[i]; 25 } 26 } 27 } 28 else 29 { 30 if (count) 31 { 32 nums[i - count] = nums[i]; 33 } 34 lastSame = false; 35 } 36 } 37 38 return nums.size() - count; 39 40 } 41 };