题目:给出一个数组,找出最小间断数,例如:[9,1,2,3,5,7,8] 最小间断数为3
最简单一种思路:将数组进行排序,排序后从最左端开始前一个元素与后一个元素相比,找出差不是1的即可,需要排序,时间复杂度就与排序算法相关,
第二种思路:找出数组中最大的一个元素,建立一个长度为该最大值的数组,然后遍历原始的数组,将元素组的值放到新数组中,并且放的下标位置就为元素的值,找到原数组最小的元素值,从该角标开始遍历新数组,若某一个位置的值为0则前一个位置就为所求,这种方式的话时间复杂度为O(n),但是空间复杂度得不到保证,与最大值相关
第三种思路:从第二种思路我们就知道,其实在新建数组中,最小值角标以前的位置我们就没有用到,那就可以将新数组中的所有元素往前移动,每一个元素放的角标不在为该元素的值了,而为该元素的值减去最小元素的值,这样的话就一定程度减小了空间复杂度;伪代码如下:
int[] result = new int[max-min+1];
for(int i=0;i<array.length;i++){
result[array[i]-min] = array[i];
}
for(int i=0;i<result.length;i++){
if(result[i]==0){
return result[i-1];
}
}
上面的程序还遗留的有一个问题,若数组中含有0,则判断会有问题,解决方案:
int[] result = new int[max-min+1];
for(int i=0;i<array.length;i++){
result[array[i]-min] = array[i]-min;---------存储的值也减去最小值
}
for(int i=1;i<result.length;i++){--------i从1开始,因为第一个位置存的是最小值对应的值,肯定为0
if(result[i]==0){
return result[i-1]+min;
}
}
还有一种解决方案:判断时不判断为0,用后一个数减去前一个数,若结果不为1,则前一个数就是
原文地址:https://www.cnblogs.com/zhaolei1996/p/12275250.html