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]
思路:跟Find All Numbers Disappered in an Array一样,用负数来记录已经出现过的信息,如果扫描的时候,已经是负数,说明已经出现过一次,这样就要加入,注意加入的是index,也就是Math.abs(nums[i]).
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
if(nums == null || nums.length == 0) {
return list;
}
for(int i = 0; i < nums.length; i++) {
int index = Math.abs(nums[i]) - 1;
if(nums[index] < 0) {
list.add(Math.abs(nums[i]));
} else {
nums[index] = -nums[index];
}
}
return list;
}
}