这道题要解答还是很简单的,直接hash,但是要让空间复杂度为O(1),忽略返回的List的大小,还是稍微动一下脑筋的。
具体思路就是:
- 将原始数组作为hash的结构,就不用新开空间了。
- 遍历数组,由于数组中数字的范围是1~n,与数组中每个元素下标可以一一对应。
- 将遍历到的数组的数字减一与n求余,范围就是0~n-1,然后将该数字作为数组下标,将下标对应的数字加n
- 最后重新遍历数组,小于等于n的数字的下标就是没出现过的数字
代码如下
import java.util.ArrayList;
import java.util.List;
public class test2 {
public static void main(String[] args){
int[] nums = {4,3,2,7,8,2,3,1};
findDisappearedNumbers(nums);
}
public static List<Integer> findDisappearedNumbers(int[] nums) {
int n = nums.length;
List<Integer> result = new ArrayList<>();
for (int i = 0; i < n; i++){
int temp = (nums[i]-1) % n;
nums[temp] += n;
}
for (int i = 0; i < n; i++){
if (nums[i] <= n){
result.add(i+1);
}
}
return result;
}
}