三种方法在小本本上。
法1(不满足条件用的hash)
class Solution {
public:
vector findDuplicates(vector& nums) {
int len=nums.size();
vector ans;
if(len<=1) return ans;
//格外的空间n,时间n
map tmp;
for(int i=0;i<=len-1;i++)
{
tmp[nums[i]]++;
if(tmp[nums[i]]==2)
ans.push_back(nums[i]);
} }};
法2(与法三类似,都是基于原有的值,储存出现次数,但是同时保留原有信息)
class Solution {
public:
vector findDuplicates(vector& nums) {
int len=nums.size();
vector ans;
if(len<=1) return ans;
int index;
for(int i=0;i<=len-1;i++)
{
index=abs(nums[i])-1;//注意不要越界
if(nums[index]<0) ans.push_back(index+1);
nums[index]=-nums[index];
}
return ans;
}
};
法3
class Solution {
public:
vector findDuplicates(vector& nums) {
int len=nums.size();
vector ans;
if(len<=1) return ans;
int index;
for(int i=0;i<=len-1;i++)
{
index=(nums[i]-1)%len;//注意不要越界
if(nums[index]>len) ans.push_back(index+1);
nums[index]=nums[index]+len;
}
return ans;
}
};
法4(最好,数字归位,最后看nums[i]和i+1的关系,不等则说明nums[i]是重复的)
class Solution {
public:
vector findDuplicates(vector& nums) {
int len=nums.size();
vector ans;
if(len<=1) return ans;
int index;
for(int i=0;i<=len-1;)
{
if(nums[nums[i]-1]!=nums[i])
swap(nums[nums[i]-1],nums[i]);
else
i++;
}
for(int i=0;i<=len-1;i++)
{
if(nums[i]!=i+1) ans.push_back(nums[i]);
}
return ans;
}
};