LeetCode第41题 First Missing Positive
/*
Given an unsorted integer array, find the smallest missing positive integer.
Example 1:
Input: [1,2,0]
Output: 3
Example 2:
Input: [3,4,-1,1]
Output: 2
Example 3:
Input: [7,8,9,11,12]
Output: 1
Note:
Your algorithm should run in O(n) time and uses constant extra space.
*/
import java.util.*;
import java.util.stream.Collectors;
public class FirstMissingPositive{
public static void main(String[] args){
// System.out.println("请输入数值:");
// Scanner sc = new Scanner(System.in);
// String[] temp = sc.nextLine().split(" ");
// int[] nums = new int[temp.length];
// for(int i=0;i<nums.length;i++){
// nums[i] = Integer.parseInt(temp[i]);
// }
// int[] -> List
// System.out.println(Arrays.toString(nums));
int[] nums = {1,2,0};
FirstMissingPositive fmp = new FirstMissingPositive();
int result = fmp.firstMissingPositive(nums);
System.out.println(result);
}
public int firstMissingPositive(int[] nums) {
// 输入数值长度检查
if (nums.length == 0) return 1;
for (int i=0;i<nums.length-1;i++){
for(int j=i;j<nums.length;j++){
if (nums[j] < nums[i]){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
/*
数值排序后分三种情况:
数组的最小值大于1
数组的最大值小于1
其他情况
*/
// 数组的最小值大于1
if(nums[0] > 1) return 1;
// 数组的最大值小于1
if(nums[nums.length - 1] < 1) return 1;
// 其他情况。判断输入的数值是否连续,不连续则输出缺失
for(int i=1;i<nums.length;i++){
// 判断两个相邻数是否是连续的
if (nums[i] - nums[i-1] >= 2){
// 判断小的数是否是大于0的
if (nums[i-1] <= 0){
// 判断大的数是否是大于1的
if (nums[i] > 1){
return 1;
}
}else{
return nums[i-1] +1;
}
}
}
// 到这里说明上面的数都是连续的
return nums[nums.length - 1] + 1;
}
public int firstMissingPositive01(int[] nums) {
if (nums.length == 0) return 1;
// Arrays.stream(arr) 可以替换成IntStream.of(arr)。
// 1.使用Arrays.stream将int[]转换成IntStream。
// 2.使用IntStream中的boxed()装箱。将IntStream转换成Stream<Integer>。
// 3.使用Stream的collect(),将Stream<T>转换成List<T>,因此正是List<Integer>。
// List<Integer> list1 = Arrays.stream(nums).boxed().collect(Collectors.toList());
List<Integer> list1 = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
list1.add(nums[i]);
}
// 对list容器排序,默认升序:Collections.reverse 逆序
Collections.sort(list1);
// 判断第一个数是否是大于1
if(list1.get(0) > 1) return 1;
// 判断输入的数值是否连续,不连续则输出缺失
for(int i=1;i<list1.size();i++){
// 判断两个相邻数是否是连续的
if (list1.get(i) - list1.get(i-1) >= 2){
// 判断小的数是否是大于0的
if (list1.get(i-1) <= 0){
// 判断大的数是否是大于1的
if (list1.get(i) > 1){
return 1;
}
}else{
return list1.get(i-1) +1;
}
}
}
// 最大的都小于1
if(list1.get(list1.size() -1) < 1) return 1;
// 到这里说明上面的数都是连续的,且最小数大于1
return list1.get(list1.size() -1) + 1;
}
}