442. Find All Duplicates in an Array
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?
Example:
Input: [4,3,2,7,8,2,3,1] Output: [2,3]
题意:
找出数组中出现2次的数(是否能用O(n)
和 没有额外空间占用解决?)
思路:
自己用了Arrays.sort()
然后再遍历数组, nums[i] == nums[i+1]
就是重复的元素了,用了48ms
看了discuss:
因为数组里的元素都是小于数组长度且大于0的,遍历数组,当找到一个数字 i
时,将位置 i-1
处的数字翻转为负数。如果位置 i-1
的数字已经是负数,那么i
是两次出现的数字。只需要16ms.
自己的AC:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
Arrays.sort(nums);
List<Integer> list = new ArrayList<>();
for(int i = 0;i<nums.length-1;i++){
if(nums[i] == nums[i+1]) list.add(nums[i]);
}
return list;
}
}//48ms
discuss:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> res = new ArrayList<>();
for (int i = 0; i < nums.length; ++i) {
int index = Math.abs(nums[i])-1;
if (nums[index] < 0)
res.add(Math.abs(index+1));
nums[index] = -nums[index];
}
return res;
}
}//16ms