zoukankan      html  css  js  c++  java
  • 字节跳动二面 找出最小间断数

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

    心有多大,天有多高,一起奋斗!!
  • 相关阅读:
    jQuery Validate 插件
    jquery.validate.js校验select2解决方案,Jquery插件select2校验解决方案
    各大浏览器CSS Hack收集
    Jquery方法load之后导致js失效解决方法
    list-style无颜色问题解决,list-style-type无颜色解决
    Css实现透明效果,兼容IE8
    jdk配置及maven配置
    兼容IE浏览器的placeholder【超不错】
    laydate兼容bootstrap
    section和article元素
  • 原文地址:https://www.cnblogs.com/zhaolei1996/p/12275250.html
Copyright © 2011-2022 走看看