使用hash和额外数组的方法不再详述。
要求不用额外空间的话,我一开始想的是第一次做负处理,第二次检测到负的话,就置位0,这样最后检测该位置是否为0就可以了;
但是!有问题啊,如果我前面的把后面的元素置零0,那后面的信息就丢了,而且会产生数组越界问题。所以第一遍阵亡,垃圾代码
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> result;
for(int i=0;i<nums.size();i++)
{
if(nums[abs(nums[i])-1]<0)
nums[abs(nums[i])-1]=0;
nums[abs(nums[i])-1]*=-1;
}
for(int i=0;i<nums.size();i++)
{
if(nums[i]==0)
result.push_back(i+1);
}
return result;
}
};
不能照着老路上了,只能从模去思考,可以每次用嵌套索引的时候加上一个n,最后遍历一遍,如果是大于2n说明出现了两次。
但是其实也有问题,这个n如何设置,我一开始用的length,但是报错,一开始还没想到,后面才想明白应该是length+1以上才行。
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> result;
int length=nums.size();
for(int i=0;i<nums.size();i++)
nums[(nums[i]) % (length + 1) - 1] += length + 1;
for(int i=0;i<nums.size();i++)
{
if (nums[i] > 2 * (length+1))
result.push_back(i+1);
}
return result;
}
};
但看了别人才知道自己太蠢了,原地反转也是可以的,我再检测到负数后,我只要加到返回数组里就是呀!!!太蠢了
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> result;
for(int i=0;i<nums.size();i++)
{
if(nums[abs(nums[i])-1]<0)
result.push_back(abs(nums[i]));;
nums[abs(nums[i])-1]*=-1;
}
return result;
}
};