给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
思路:时间复杂度要求为o(n),那不可以用暴力法一次又一次的搜索
可以将每个数字放到对应的位置上,数字值超过数组大小的不用管,值小于等于0的不用管
最后从头遍历数组,出现第一个位置上缺失的值,那这个值就是最小的正整数
如果一直没有出现,那最小正整数就是nums.length+1
eg:
[1,5,2,0,-2]
-->进行对应位置的放置,[1,2,-2,0,5]
我们发现,第一个没有对应值的位置是i=2处,此时值应为3,但是却是-2,所以我们缺失的就是3
[1,3,4,2,5]
-->进行对应位置的放置,[1,2,3,4,5]
放置完成后,我们遍历数组,发现都有对应的值,所以我们缺失的就是nums.length+1=6
此方法遍历了两次数组,因此时间复杂度为2*O(n),也就是O(n)
提交的代码:
class Solution {
public int firstMissingPositive(int[] nums) {
int t;
for(int i=0;i<nums.length;)
{
if(nums[i]<=0)
{
i ++;
continue;
}
if(nums[i]-1>=nums.length)
{
i++;
continue;
}
if(nums[i]!=i+1&&nums[nums[i]-1]!=nums[i])
{
t = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = t;
}
else
{
i++;
}
}
for(int i=0;i<nums.length;i++)
{
if(nums[i]!=i+1)
{
return i+1;
}
}
return nums.length+1;
}
}