丢失的第一个正整数
题目
给出一个无序的正数数组,找出其中没有出现的最小正整数。
样例
如果给出 [1,2,0], return 3
如果给出 [3,4,-1,1], return 2挑战
只允许时间复杂度O(n)的算法,并且只能使用常数级别的空间。
题解
使用桶排序原理,将A[i](大于0且小于等于A的长度)通过交换放置到A[A[i]-1],最后再遍历一遍找到第一个缺失的数。
如[3,4,-1,1]通过交换得到
[-1,4,3,1]
[-1,1,3,4]
再遍历得到第一个缺失的数为2。
A[i]交换的限制条件为:
1.A[i]>0
2.A[i]<=A[i].length
3.A[i] != A[A[i]-1]避免死循环
public class Solution {
/**
* @param A: an array of integers
* @return: an integer
*/
public int firstMissingPositive(int[] A) {
for (int i = 0; i < A.length; i++)
{
while (A[i] <= A.length && A[i] > 0 && A[A[i] - 1] != A[i])
{
swap(A, i, A[i] - 1);
}
}
for (int i = 0; i < A.length; i++)
{
if (A[i] != i + 1)
{
return i + 1;
}
}
return A.length + 1;
}
public void swap(int[] A, int l, int r)
{
int tmp = A[l];
A[l] = A[r];
A[r] = tmp;
}
}
Last Update 2016.10.28