题目:给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
思路:先给数组元素排序,然后相等的挨在一起,判断相邻的两个位置是否相等就好
代码如下:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
for (int i=0;i<nums.length-1;i++){
if (nums[i] == nums[i+1]){
list.add(nums[i]);
}
}
return list;
}
}
这种方法结果
思路二:将数组元素转换成索引,遍历数组,如果找到的值是负数,即重复数,如果是正数,则给它乘-1.
代码如下:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> list = new ArrayList<>();
int index = 0;
for(int i = 0; i < nums.length; i++) {
//防止当前元素*-1变成负数
//这里不要定义 int index,放在外面定义
index = Math.abs(nums[i])-1;
if(nums[index] < 0)
list.add(index+1);
else
nums[index] = -nums[index];
}
return list;
}
}
结果