现在已将LeetCode刷题心得记录github上,每一题都有我能够想到的多种解法,欢迎star!github
这一题总的来说很简单,最容易想到的就是遍历数组,判断是否和前一个数相同,相同的话就删除,不删除的话计数加1
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int tmp= nums[0];
int num=1;
for(vector<int>::iterator it=nums.begin()+1;it!=nums.end();)
{
while(*it==tmp)
{
it=nums.erase(it);
if(it==nums.end())
{
break;
}
}
if(it!=nums.end())
{
tmp=*it;
it++;
num++;
}
}
return num;
}
};
但是这种方式总是在数组循环过程中修改数组元素,总感觉不是很安全和高效,事实证明只能打败46%答案。因此可以换一种思路,遍历数组,碰到一个新的数值就将它覆盖头指针的数值,头指针加一,最后统一删除头指针后面的元素即可,结果可以打败70%左右的答案。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
if(nums.size()==1) return 1;
int i=0;
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]!=nums[j])
{
nums[++i]=nums[j];
}
}
for(vector<int>::iterator it=nums.begin()+i+1;it!=nums.end();)
{
it=nums.erase(it);
}
return i+1;
}
};
这一题和27像,可以用同样的方式解决:
方法如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i=0;
for(int j=0;j<nums.size();j++)
{
if(nums[j]!=val)
{
nums[i++]=nums[j];
}
}
for(vector<int>::iterator it=nums.begin()+i;it!=nums.end();)
{
it=nums.erase(it);
}
return nums.size();
}
};
可以打败98%的答案