因为这道题目的题意是要求我们在原数组上进行操作,所以操作变得稍微复杂了些,否则直接使用map最为简单。
基本思想是记录两个指针,一个是当前数组,另一个是目的数组,注意如果发现重复数超过2,那么目的数组的cur就要阻塞,
直到不同的出现后再赋值前进。
class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; int cur=1; //修改后数组的下标点 int sum=0,temp; for(int i=1;i<nums.size();i++) { temp=nums[i]; if(nums[i]==nums[i-1]) { sum++; if(sum<2) { nums[cur]=temp; cur++; } } else { sum=0; nums[cur]=temp; cur++; } } return cur; } };
还有一种是网上的解法,一开始没想通,后来发现忘看了条件--->数组已经排好序了,所以仅判断nums[i]和nums[i-2]是可行的。
如果i扫到的当前元素在index之前已经存在两个(注意,由于A是排好序的,因此只需要判断前两个就行),那么i继续前进。否则将i指向的元素加入index,index与i一起前进。
class Solution { public: int removeDuplicates(int A[], int n) { if(n < 3) return n; int index = 2; for(int i = 2; i < n; i ++) { if(A[i] != A[index-2]) A[index ++] = A[i]; } return index; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-27 23:42:57