年前去面试被问到的一个题目,面试官没说复杂度要求,我想的是先排序,再从1开始查找,查到不存在的就是要找的数字。写了个快速排序,然后二分查找,后来还没写完,被面试官嫌弃写的太慢,讲了思路,被面试官嫌弃太复杂,感觉不太好。回来后网上查了解法,原来这个题目是有复杂度要求的,不能排序,呵,反正这个解法我自己绝壁是想不出来的。
以下为参考这位大神的题解自己总结的。
缺失的正整数
题目:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
思路:
假设数组的大小是N,那么如果从1开始存放连续数字的话,数组中最大能存的数字是N。
现在移动数组中的数字,如果1存在的话,使1放在第0个位置,如果2存在的话,使2放在第1个位置,负数和0,以及大于N的数字在数组中找不到位置,暂且叫它们“非法数字”,碰到非法数字的话不用移动,遍历数组完成所有数字移动。然后再遍历数组,如果哪个位置该放某个数字而没有放,也就是说这个位置上的数字是非法数字