LeetCode刷题day041 (Jieky)

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值