找到缺失的第一个正整数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间O(1)。
这道题如果不要求时间复杂度为O(n)和空间O(1)的话,其实很简单的,可以先对数组做一个排序,然后从小到大的找第一个缺失的正整数。但是排序的时间复杂度至少也是O(nlogn)。所以不能用排序的方法来进行查找。
对一个数组而言,其实最小的值排列就是[1…..length]的值,这个怎么理解呢。比如长度为4的数组,那么这个数组最小整数排列就是1,2,3,4。也就是长度为4的数组能容纳的最小数就是1,2,3,4。那么对于任意一个长度为4的数组,缺失的最小正整数就一定在[1-length]之间的值。对于索引而言就是最小正整数一定存在于[1-index+1]的范围。
既然最小的值和数组的索引有如此的关系,那么我们就可以借助索引的方法,将各个值放入到其对应的索引中去。比如i=4, num[i]=3, 那么我们就该把3和i=2的值进行互换。至于值超出数组长度或者负数,则不用去管。这样能保证在数组长度范围内的数都在起索引的位置上。变相起到了排序的功能。
用一个长度为5的数组来看下:
-1, 3, 5, 2, 7
Step1: i=0; num[i]=-1。不处理. i++
Step2: i=1; num[i]=3<5, 因此放入对应的索引位置,也就是3-1=2, 将num[1]和num[2]对换。数组变成-1,5,3,2,7.
Step3:i=2;num[i]=3 正好对应其索引位置,不处理,i++;
Step4:i=3 num[3]=2<5 放入对应的索引位置,也就是2-1=1, 将num[3]和num[1]对换。
数组变成-1,2,3,5,7
Step5:i=4 num[4]=7>5 不处理
最终的数组变成-1,2,3,5,7。 那么从数组开始判断,看下num[i]是否是和i+1相等。如果不是,则缺失的最小正整数就是i+1。 上面的数组明显就可以得出缺失的最小正整数就是0+1=1。
代码如下:
int firstMissingPositive(int a[], int len) { int i,temp; i = 0; while(i<len) { if (a[i] < 0 || a[i] > len || a[a[i] - 1] == a[i]) { i++; } else { temp = a[a[i] - 1]; a[a[i] - 1] = a[i]; a[i] = temp; i++; } } for (i = 0; i < len; i++) { if (a[i] != i + 1) return i + 1; } return -1; }
原文地址:https://www.cnblogs.com/zhanghongfeng/p/11696533.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Day21.Python项目案例
- Day18.python文件/目录
- Kotlin学习日志(六)控件使用
- Android 天气APP(一)开发准备
- Android 天气APP(二)获取定位信息
- Android 天气APP(三)访问天气API与数据请求
- Android 天气APP(四)搭建MVP框架与使用
- Android 天气APP(五)天气预报、生活指数的数据请求与渲染
- Android 天气APP(六)旋转风车显示风力、风向
- Android 天气APP(七)城市切换 之 城市数据源
- Elasticsearch: Reindex接口
- Android Studio 更新版本之后报错: Cannot access android.arch.lifecycle.ViewModelStoreOwner
- Android各版本查询和开启悬浮窗权限
- RuntimeException: setAudioSource failed异常
- Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例