给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。
不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。
样例
给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]。
这种简单难度的题要训练到第一时间想到解法,先上一个丑的不行的解法
1 int removeDuplicates(vector<int> &nums) { 2 // write your code here 3 if(nums.empty()){ 4 return 0; 5 } 6 vector<int>::iterator it=nums.begin(); 7 vector<int>::iterator temp; 8 it++; 9 int mark=nums[0]; 10 while(it!=nums.end()){ 11 if(*it==mark){ 12 temp=it; 13 it=nums.erase(temp); 14 } 15 else{ 16 mark=*it; 17 it++; 18 } 19 } 20 return nums.size(); 21 }
两个指针一前一后,如果后和前一样,删除后,并将后向后移一位。
至少上面这种要第一个想到,下面贴一个美观的
1 int removeDuplicates(vector<int> &nums) { 2 if(nums.empty()) return 0; 3 int count=0; 4 for(int i=1;i<nums.size();i++){ 5 if(nums[i]!=nums[count]){ 6 count++; 7 nums[count]=nums[i]; 8 } 9 } 10 nums.resize(count+1); 11 return count+1; 12 }
count+1内的数组是结果,将>=count的数覆盖进count,然后删除多余的。