442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例: 输入: [4,3,2,7,8,2,3,1] 输出: [2,3]
解题思路
这道题主要看它的条件:1 ≤ a[i] ≤ n (n为数组长度),也就是说,数组里面的数是不会小于0,而且也不会大于数组的长度的。
再仔细看看,数组的下标是0n-1,条件是1n,那么可以按照这样的方式:
从下标取出这个位置的数,由这个位置取余可以得到一个数,让它 + 数组的长度,如果两个数相同,那么最后势必会加上两次数组长度,我们就可以判断哪些数 > 2倍数组长度,这个数肯定是重复的,因为计算了遍。
代码实现
public class FindDuplicates {
public static void main(String[] args) {
int[] nums =new int[]{7,7,7,3,3,1,1,1,1,1,2,3,6};
System.out.println(findDuplicates(nums));
}
public static List<Integer> findDuplicates(int[] nums){
List<Integer> list = new ArrayList<>();
int n = nums.length;
for(int i = 0; i < n; i++){
nums[(nums[i] - 1) % n] += n;
}
for(int i = 0; i < n; i++){
if(nums[i] > 2 * n) list.add(i+1);
}
return list;
}
}