这道题目要求数组中消失的数字,由于数组元素值在区间[1,n]内,所以很容易可以想到一个n+1个数的数组,用元素值作为数组下标去填充该数组并且做特殊标记,然后再遍历这个n+1个数的数组就能找到缺失的元素
还有一种办法,不需要开任何数组,其实仔细观察这道题目,数组的索引和数组元素-1刚好是一一对应关系,我们可以在原来的数组基础之上对数组进行更改,跟上面的思路是类似的,针对出现的元素做一个特殊标记,比如数组元素是3,那么把arr[3-1]拿到的这个值改成原来值的相反数,而缺失的元素对应的值肯定是正数
import java.util.List;
import java.util.ArrayList;
public class findAllNumbersDisappearedinanArray {
public static void main(String[] args) {
int[] arr = {4,3,2,7,8,2,3,1};
//List<Integer> lis = findMiss(arr);
List<Integer> lis = findMissSaveSpace(arr);
for(Integer i: lis) {
System.out.println(i);
}
}
public static List<Integer> findMissSaveSpace(int[] arr) {
for(int i = 0;i<arr.length;i++) {
int idx = Math.abs(arr[i])-1;
arr[idx] = arr[idx] > 0 ? -arr[idx] : arr[idx];
}
List<Integer> lis = new ArrayList();
for(int i = 0;i<arr.length;i++) {
if(arr[i] > 0) {
lis.add(i+1);
}
}
return lis;
}
public static List<Integer> findMiss(int[] arr) {
int n = arr.length;
int brr[] = new int[n+1];
for(int i = 0;i<arr.length;i++) {
brr[arr[i]] = 1;
}
List<Integer> lis = new ArrayList();
for(int i = 1;i<n+1;i++) {
if(brr[i] == 0) {
lis.add(i);
}
}
return lis;
}
}