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.
思路:去重复值,遍历查找断点,无断点的判断两端边界值,我的方法比较笨,O(∩_∩)O哈哈~
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public int firstMissingPositive(int[] nums) {
// 去重复,记录是否有1
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < nums.length; i++) {
if (!list.contains(nums[i])) {
list.add(nums[i]);
}
}
int[] uniqueNums = new int[list.size()];
boolean hasOne = false;
for (int i = 0; i < list.size(); i++) {
uniqueNums[i] = list.get(i);
if (uniqueNums[i] == 1) {
hasOne = true;
}
}
// 边界检测
if (uniqueNums.length == 0) {
return 1;
}
if (uniqueNums.length == 1) {
if (!hasOne) {
return 1;
} else {
return 2;
}
}
// 排序
Arrays.sort(uniqueNums);
// 遍历,找断点
for (int i = 0; i < uniqueNums.length - 1; i++) {
int num1 = uniqueNums[i];
int num2 = uniqueNums[i + 1];
if (num2 - num1 != 1) {
if (num1 <= 0 && num2 > 0) {
if (!hasOne) {
return 1;
}
}
if (num1 > 0 && num2 > 0) {
if (num1 != 1 && !hasOne) {
return 1;
} else {
return num1 + 1;
}
}
}
}
if (uniqueNums[uniqueNums.length - 1] <= 0) {
return 1;
} else {
if (uniqueNums[0] != 1 && uniqueNums[0] > 0) {
return 1;
} else
return uniqueNums[uniqueNums.length - 1] + 1;
}
}
}