方法一:时间复杂度o(n),空间复杂度o(n)

import java.util.*;


public class Solution {
    /*
    * 如果数组中所有数都为1-n范围内,且1-n全部都在,为n+1
    * 如果有一个不在1-n范围内,则结果<=n
    * 依据这样的思路可以想到:遍历数组,如果不在1-n范围内,肯定不是要求的数字,删除
    * 如果在1-n范围内,将对应的hash表值设置为true,从前往后枚举hash表找到第一个false的值
    *
    * */
    public int minNumberDisappeared(int[] nums) {
        HashMap<Integer, Boolean> hashMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= 1 && nums[i] <= nums.length) {
                hashMap.put(nums[i], true);
            }
        }
        for (int i = 1; i <= nums.length; i++) {
            if (!hashMap.containsKey(i))
                return i;
        }
        return nums.length + 1;
    }
}

方法二:原地hash,空间复杂度o(1),时间复杂度o(n)

public int minNumberDisappeared(int[] nums) {
        int n = nums.length;
        //将所有的负数置为n+1,下面负数不参与讨论
        for (int i = 0; i < n; i++) {
            if (nums[i] <= 0) {
                nums[i] = n + 1;
            }
        }
        for (int i = 0; i < n; i++) {
            //将在n范围内的值对应下标的值置为负值,说明,该下标的值出现过
            if (Math.abs(nums[i]) <= n) {
                nums[Math.abs(nums[i]) - 1] = -1 * Math.abs(nums[Math.abs(nums[i]) - 1]);
            }
        }
        //第一个正数说明是未出现的值
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }