题目描述:
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
样例:
输入:[4,3,2,7,8,2 ,3,1]
输出:[2,3]
分析:
这道题和上一题的解法一致,如果nums[i]!=i+1,则将nums[i]存放到其对应的下标处,如果该下标中的元素和nums[i]相等,证明该元素重复加入列表并将nums[i]置为-1,否则会重复添加。如果不相等则将i位置处的元素和nums[i]-1处的元素交换位置。
public List<Integer> findDuplicates(int[] nums) {
List<Integer> list=new ArrayList<>();
if(nums==null||nums.length==0)
return list;
for(int i=0;i<nums.length;i++) {
while(nums[i]!=-1&&nums[i]!=i+1) {
int index=nums[i];
if(nums[index-1]==index) {
list.add(index);
nums[i]=-1;
break;
}else {
int temp=nums[index-1];
nums[index-1]=index;
nums[i]=temp;
}
}
}
return list;
}