Tips
使用vector.size()时,在for循环中要写i<size()不要写i<size()-1。因为当vector的size为0时,size()函数返回值是无符号整型,这时vec.size()-1是一个正数,会导致*vec[i]*访问越界。
##题解
首先考虑了暴力解法,两个循环寻找相等的元素,找到后将其就地改为-1,记录下个数。再一次循环把不是-11的元素(随意值)放在数组的末尾。(此处默认了输入元素中不含有-11)。
#include "iostream"
#include "vector"
class Solution {
public:
void swap(int i,int j)
{
int temp=0;
temp=i;
i=j;
j=temp;
}
int removeDuplicates(vector<int>& nums) {
int len=nums.size();
int cnt=0;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(nums[j]==nums[i]){
nums[j]=-11;
cnt++;
}
}
}
while(cnt)
{
for(int k=0;k<len;k++)
{
if(nums[k]=-11)
swap(nums[k],nums[len-cnt]);
cnt--;
}
}
return cnt;
}
};
这样的做法明显时间复杂度超时。题解给出了相当好用的快慢指针的解法。
#include "iostream"
#include "vector"
class Solution
{
int removeDuplicates(vector<int>& nums)
{
int len=nums.size();
if(0==len)return 0;
int i,j;
for(i=0,j=i+1;j<len;j++)
{
if(nums[j]!=nums[i])
i++;
nums[i]=nums[j];
}
return i+1;
}
};