题目:
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
题意:
给定一个无需的整数数组,求其中第一个没有出现的正数。例如:给定一个数组[1,2,0],那么第一个没有出现的正数就是3。
题解:
通过本题给的例子,我们可以发现,要求第一个没有出现的正数,那么这个正数必然在1到这个数组的长度之间的数字,因为会有连续的正数出现,那么我们可以想到采用类似于哈希表的形式,将每个数字和它所应该对应的下标,因为正数从1开始,那么其下标我们规定从0开始,同时题目又要求空间复杂度为O(1),也就是不能有额外的空间,所以我们就可以通过交换的方式来进行;最后扫描一遍数组,发现数组中的第一个数字不等于它的下标减1的那个数,返回。如果没有这个数字出现,那么就返回数组长度 + 1.类似于例子1的情况。如果数组中的数字是小于等于0或者是大于数组的长度的,那么直接就pass,不在我们题目考虑的范围内。
public int firstMissingPositive(int[] nums)
{
int length = nums.length;
for(int i = 0; i < length; i++)
{
if(nums[i] > 0 && nums[i] <= length) //如果这个数字是在我们考虑的范围内,那么我们就进一步就要和交换了
{
if(nums[i] - 1 != i && nums[nums[i] - 1] != nums[i])
{
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
i--;
}
}
}
for(int i = 0; i < length; i++) //查看这个新调整后的数组中第一个数字不等于它的下标-1的数字,返回
{
if(nums[i] != i + 1)
return i + 1;
}
return length + 1; //否则说明没有这个数字出现,那么就返回数组的长度 + 1
}