Given an unsorted integer array, find the first missing positive integer.
For example,
Given
and
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.
因为用O(n)时间和constant空间 所以不能用hashtable. 可以将数组本身变成一个hashmap 使得nums[0] = 1, num[1] = 2... nums[i] = i + 1 最后如果哪个i违反了num[i] = i +1 , i + 1 就是我们要找的值
扫描数组中每个数:
让A[0]=1, A[1]=2, A[2]=3, ... , 这样一来,最后如果哪个数组元素违反了A[i]=i+1即说明i+1就是我们要求的第一个缺失的正数
1. 如果A[i]<1或者A[i]>n。跳过
2. 如果A[i] = i+1,说明A[i]已经在正确的位置,跳过
3. 如果A[i]!=i+1,且0<A[i]<=n,应当将A[i]放到A[A[i]-1]的位置,所以可以交换两数。
这里注意,当A[i] = A[A[i]-1]时会陷入死循环。这种情况下直接跳过。
避免2和死循环可以用 A[i] != A[A[i] - 1] 来描述
时间O(n)
public class Solution { public int firstMissingPositive(int[] nums) { if (nums == null || nums.length == 0) { return 1; } for (int i = 0; i < nums.length; i++) { if ( nums[i] > 0 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]) { int tem = nums[nums[i] - 1]; nums[nums[i] - 1] = nums[i] ; nums[i] = tem; i--; //先改变nums[nums[i] - 1] 再改变nums[i] 否则nums[i]先变化nums[nums[i - 1]]就不是原来的位置了 } } for (int i = 0; i < nums.length; i++) { if (nums[i] != i + 1) { return i + 1; } } return nums.length + 1; } }
没有评论:
发表评论