Given an unsorted integer array, find the first missing positive integer.
For example,
Given[1,2,0]return3,
and[3,4,-1,1]return2.
Your algorithm should run in O(n) time and uses constant space.
解题思路:将数组存入Arraylist中,因为这样遍历数组中的任何一个元素的时间变成O(1),即以空间换取时间。
步骤:
(1)遍历数组,找到最大值max,并将数组存入Arraylist中,时间复杂度为O(n)。
(2)遍历从正整数1到最大值max之间的数,并判断Arraylist中是否包含该数。若不包含该数字,则该数字就是第一个缺失的正整数;若循环走到底,即Arraylist包含了1到max之间所有数,则第一个缺失数字就是max后一个数字,即max+1.时间复杂度为O(n)。
import java.util.ArrayList;
public class Solution {
/*解题思路:先将数组存入Arraylist中,因为这样遍历数组中的任何一个元素的时间变成O(1),即以空间换取时间。
步骤:(1)遍历数组,找到最大值max,并将数组存入Arraylist中,时间复杂度为O(n)
(2)遍历从正整数1到最大值max之间的数,并判断Arraylist中是否包含该数。若不包含该数字,则该数字就是第一个缺失的正整数;
若循环走到底,即Arraylist包含了1到max之间所有数,则第一个缺失数字就是max后一个数字,即max+1.时间复杂度为O(n)*/
public int firstMissingPositive(int[] A) {
if(A.length == 0)
return 1;
ArrayList<Integer> list = new ArrayList<>();
int max = 0;
//步骤(1)
for(int i = 0;i < A.length;i ++){
list.add(A[i]);
if(A[i] > max){
max = A[i];
}
}
//步骤(2)
for(int i = 1;i <= max;i ++){
if(!list.contains(i))
return i;
}
return max + 1;
}
}