LeetCode: First Missing Positive
Given an unsorted integer array, find the first missing positive integer.
本想用求和的方法解决,但是因为有重复的数,所以这么解决不了。
看了网上的解法,是排序。当时我以为排序肯定是O(nlogn)啊,所以没想到怎么解决。
但是这里忽略了一个条件,我们需要排序的数据是从1开始的连续的数。
所以可以这样排序。把每个元素放到对应的位置上。1就放到A[0], 2就放到A[1]....
只要这样排好序,再找到第一个位置与数不对应的就是missing positive。
这里要注意,对什么样的数据进行交换排序是有条件的。1. 它应该是一个正数 2. 它不能超过数组的范围。e.g.[1, 3]
3. 它不在自己应该在的位置上。4.它的位置上的元素不正确。如果它的位置上的元素正确,说明它是一个重复元素。
1 public int firstMissingPositive(int[] A) { 2 for (int i=0; i<A.length; i++) { 3 if (A[i] > 0 && A[i] <= A.length) { 4 if (A[i] != i+1 && A[A[i] - 1] != A[i]) { 5 int t = A[A[i] - 1]; 6 A[A[i] - 1] = A[i]; 7 A[i] = t; 8 i--; 9 } 10 } 11 } 12 13 for (int i=0; i<A.length; i++) { 14 if (A[i] != i+1) { 15 return i+1; 16 } 17 } 18 19 return A.length+1; 20 }