题目描述:
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.
解题思路:
参考http://blog.csdn.net/nanjunxiao/article/details/12973173
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1),过程中注意边界条件以及重复数字的处理。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
代码如下:
public class Solution { public int firstMissingPositive(int[] nums) { int length; int temp; if (nums == null || (length = nums.length) == 0) return 1; for (int i = 0; i < length; i++) { if (nums[i] == i + 1) continue; else { while (nums[i] > 0 && nums[i] <= length && nums[i] != nums[nums[i] - 1]) { temp = nums[i]; nums[i] = nums[nums[i] - 1]; nums[temp - 1] = temp; } } } for (int i = 0; i < length; i++) { if (nums[i] != i + 1) return i + 1; } return length + 1; } }