最小可用ID:在非负数组(乱序)中找到最小的可分配的id(从1开始编号),数据量1000000

上面的数组的最小可用ID为1

这个数组的最小可用ID就为16
方法一:暴力解法------时间复杂度高O(n^2)

package smallid;import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;public class smallid {static class Util{static int indexOf(int[] arr,int i) {  //声明方法return i;}}//暴力解法O(n^2),从1开始依次探测每一个自然数是否在数组中static int find1(int[] arr){int i=1;   //i从1开始while(true) {if(Util.indexOf(arr,i) == -1){   //找到没有的那个数返回return i;}i++;  //若不是,继续循环}}
}

方法二:快速排序,让数组变得有序后找出缺少的数------时间复杂度O(nlogn)

package smallid;public class Smallidk {static class Array{static void sort(int[] arr) {  //声明方法return ;}int find2(int[] arr){Array.sort(arr);   //对数组进行排序int i=0;     //数组下标从0开始  ,i为数组下标while(i<arr.length) {if(i+1!=arr[i]) {    //当数组下标和对应的数不匹配时return i+1;  //返回对应缺少的数}i++;  //否则,继续循环}return i+1;}
}
}

方法三:利用辅助数组进行扫描-------时间复杂度O(n)

辅助空间的数组下标表示该下标元素出现的次数
伪代码

 helper=[A.length]for(i:0.....A.length-1)helper[A[i]-1=1;  //下标转为数字}for(i:0......A.length-1 //扫描辅助空间if(helper[i]==0)  //若help的下标没有系数为1return i+1;}return A.length+1;

代码

package smallid;import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;import sun.applet.Main;public class Smallid2 {public static int find3(int[] arr) {int n=arr.length;  //定义数组长度int[] helper=new int [n+1];  //定义辅助空间for(int i=0;i<n;i++) {  //构造辅助数组helper[arr[i]]=1;  }for(int i=1;i<=n;i++) {  //扫描辅助数组if(helper[i]==0) {   //如果辅助空间数组下标出现次数为0return i;  //返回该元素}}return n+1;  //若数组长度范围内度存在,则返回n+1}public static void main(String[] args) {int[] arr= {1,2,3,4,5,8,9,10,11,12};long now=System.currentTimeMillis();Object find2;Smallidk find2=new Smallidk();System.out.println(find2(arr));Util.duration(now);now=System.currentTimeMillis();System.out.println(find3(arr));Util.duration(now);}
}

方法四:区间分割法

假设一个长度为100的数组
分为以下三种情况;
1.中间值恰好为50时,表明数组左半区间数字元素紧凑,没有要找的缺少元素
2.中间值为大于50的值,表明数组左半区间有漏掉的元素

package smallid;
public class Smallidfenqu {public static int find4(int[] arr,int l,int r) {  //定义数组,左指针,右指针if(l>r)return l+1;int midIndx=l+((r-l)>>1);   //中间下标,用右指针减去左指针加1int q=selectk(arr,l,r,midIndex-l+1);  //实际中间位置的值int t=midIndex+1;  //t为要求的期望值if(q==t) {  //左侧紧密return find4(arr,midIndex+1,r);  //在右半区间查找}else {   //左侧稀疏return find4(arr,l,midIndex-1);  //在左半区间查找}}public static void main(String[] args) {int[] arr= {1,2,3,4,5,8,9,10,11,10000};arr=new int[1000*1000];}
}

最小可用ID(4种方法,详细讲解)相关推荐

  1. mysql查询最小的id_Mysql查询表中最小可用id值的方法

    今天在看实验室的项目时,碰到了一个让我"棘手"的问题,其实也是自己太笨了.先把 sql 语句扔出来 // 这条语句在id没有1时,不能得到正确的查询结果. select min(i ...

  2. Require使用方法详细讲解

    Require使用方法详细讲解 文章目录 Require使用方法详细讲解 一.AMD 规范 1,AMD 基本介绍 2,AMD 模块规范 二.RequireJS 介绍 1,什么是 RequireJS 2 ...

  3. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...

    本文主要向大家介绍了MySQL数据库之修改mysql默认字符集的两种方法详细解析 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. (1) 最简单的修改方法,就是修改mysql的m ...

  4. SQLite3 获取最小可用ID,ID无需包含1

    SQLite3 获取最小可用ID,ID无需包含1 一.语法 二.解析 1. 判断最小ID是否为1 2. 判断最小ID递增后是否存在 3. 范围限定 三.总结 一.语法 获取1 到 500 范围间的最小 ...

  5. 脱壳的几种方法 详细操作步骤

    脱壳的几种方法  详细操作步骤 常见脱壳知识: 1.PUSHAD (压栈) 代表程序的入口点 2.POPAD (出栈) 代表程序的出口点,与PUSHAD相对应,一般找到这个,说明OEP可能就在附近 3 ...

  6. 队列使用方法详细讲解

    队列详细讲解 队列是一种先进先出的线性表,它只允许在表的一段进行插入元素,在表的另一端删除元素,先进先出,插入的一端叫做队尾(back),删除的一段叫做对头(front) 队列定义在<queun ...

  7. HDU Problem - 6214 Smallest Minimum Cut(最小割边,两种方法)

    题目链接 Problem Description Consider a network G=(V,E)G=(V,E)G=(V,E) with source sss and sink t" r ...

  8. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...

    描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...

  9. Python海龟Turtle的使用画中秋画的方法详细讲解

    最近发现很多博主使用Turtle库进行画作,今天来详细讲解海龟库方法 一.定义: Python的turtle库是一个用于绘制图形的库,它来自 Wally Feurzeig, Seymour Paper ...

最新文章

  1. spring依赖注入单元测试:expected single matching bean but found 2
  2. 6 有序集合ZSet(Sorted Set)
  3. 统计学---掌握数据的整体状态
  4. 图像变清晰 图像放大 提高分辨率 提高清晰度
  5. 画一个圆角多边形_CAD零基础教程,矩形和多边形的画法
  6. 计算机视觉--优秀开源方案集锦
  7. Set集合存储元素不重复的原理
  8. js 随机1-10随机数_寻找随机的错误-一个真实的故事
  9. 可行的DeltaSpike教程
  10. paper 35 :交叉验证(CrossValidation)方法思想
  11. 发行版迁移及二进制兼容性注意事项
  12. Git基础操作及常见命令——详解
  13. SQL拼接自己需要的字符串
  14. 操作系统Clock算法
  15. c++ 15个语言特性,C++11/14的新特性(更简洁)
  16. python爬取天天基金历史净值_python爬取天天基金网全部基金的历史全部净值
  17. 检测网站CDN是否生效
  18. CNN-VGG16图片性别年龄识别(说白了就是图片分类)
  19. 严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
  20. 漫步在云台山茶园穿越,感受来自李亮先生的美意

热门文章

  1. python难学吗-python语言好学吗
  2. python装饰器详解-学习笔记-Python装饰器详解
  3. 低延时互动直播双十一优惠活动
  4. 科大讯飞输入法解锁高效语音输入
  5. 语音识别人工智能解决方案
  6. 谷歌发布机器学习云平台 开放语音识别API
  7. VUE图片预览放大缩小插件viewer
  8. git远程仓库中master及其余分支间代码的合并
  9. 【java笔记】list接口
  10. Darwin Streaming Server 安装流程