题目
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
我的想法
类似于双指针。但是先排序的话复杂度就是O(nlogn)了
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
HashSet<Integer> res = new HashSet<>();
Arrays.sort(nums);
int target = 1;
int index = 0;
while(index < nums.length) {
if(nums[index] == target) {
target++;
index++;
} else if(index >= 1 && nums[index] == nums[index - 1]) {
index++;
} else if(nums[index] > target) {
res.add(target);
target++;
}
}
while(target <= nums.length) {
res.add(target);
target++;
}
return new ArrayList<Integer>(res);
}
}
解答
leetcode solution:
这个方法太巧妙了,把有数的地方置为负数来做标记。但是不属于常规做法,属于智力题?
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> ret = new ArrayList<Integer>();
for(int i = 0; i < nums.length; i++) {
int val = Math.abs(nums[i]) - 1;
if(nums[val] > 0) {
nums[val] = -nums[val];
}
}
for(int i = 0; i < nums.length; i++) {
if(nums[i] > 0) {
ret.add(i+1);
}
}
return ret;
}
}