引言
现在有1-N个连续整数,顺序被打乱了,但中间少两个数,请找到这两个数
思路
1.有1-N个连续数组,中间少两个数,那么就准备一个N+2的boolean类型的数组桶
2.把连续数组元素的作为桶的下坐标,把桶下坐标的值变为true
3.从1开始循环boolean桶,把元素false的下坐标找出来,就是缺少的数
代码
public class FindMissedNumber {
public static int[] findMissedNumber(int[] arr){
if(null == arr || arr.length < 2) {
return new int[] {-1,-1};
}
// 获取数组长度
int len = arr.length;
// 准备长度+2的桶
boolean[] num = new boolean[len + 2];
// 循环数组改变桶元素值
for (int i = 0; i < len; i++) {
num[arr[i]] = true;
}
//返回的缺少数的数组
int[] miss = new int[3];
// 素组下坐标
int j = 0;
// 从循环桶、找到是false的元素下坐标
for(int i=1; i < num.length; i++){
if(!num[i]){
miss[j++] = i;
}
}
return miss;
}
public static void main(String[] args) {
int[] s = new int[]{0,2,5,9,7,4,12,1,13,8,10,11};
int[] ss = findMissedNumber(s);
System.out.println(ss[0]+ "" + ss[1]);
}
}
利用桶的原来,可以很好的解决这个问题,时间复杂度是O(N)。空间复杂度也是O(N),如果利用排序,那么时间空间复杂度会上升上去。