字节跳动二面 找出最小间断数

题目:给出一个数组,找出最小间断数,例如:[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,则前一个数就是

 

posted on 2020-02-08 00:03  努力学习的菜鸡  阅读(410)  评论(0编辑  收藏  举报

导航