
题目描述
41. 缺失的第一个正数
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
示例 1:
1 2 3
| 输入:nums = [1,2,0] 输出:3 解释:范围 [1,2] 中的数字都在数组中。
|
示例 2:
1 2 3
| 输入:nums = [3,4,-1,1] 输出:2 解释:1 在数组中,但 2 没有。
|
示例 3:
1 2 3
| 输入:nums = [7,8,9,11,12] 输出:1 解释:最小的正数 1 没有出现。
|
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
解题思路
方法一
- 将数组添加到 hash 表中(只需要大于0的部分)
- 从 1 开始遍历,如 hash 表中不包含对应的 key 则返回
方法二

代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Solution41Case1 {
private static int firstMissingPositive(int[] nums) { int length = nums.length; List<Integer> list = new ArrayList<>(length); for (int num : nums) { if (num < 0) { continue; } list.add(num); } for (int i = 1; i <= length + 1; i++) { if (!list.contains(i)) { return i; } } return 0; }
public static void main(String[] args) { int[] nums = {7, 8, 9, 11, 12}; System.err.println(firstMissingPositive(nums)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Solution41Case2 {
private static int firstMissingPositive(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for (int num : nums) { if (num > 0) { map.put(num, 1); } } for (int i = 1; i <= map.size() + 1; i++) { if (!map.containsKey(i)) { return i; } } return 0; }
public static void main(String[] args) { int[] nums = {7, 8, 9, 11, 12}; System.err.println(firstMissingPositive(nums)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class Solution41Case3 { private static int firstMissingPositive(int[] nums) { int n = nums.length; for (int i = 0; i < n; ++i) { if (nums[i] <= 0) { nums[i] = n + 1; } } for (int i = 0; i < n; ++i) { int num = Math.abs(nums[i]); if (num <= n) { nums[num - 1] = -Math.abs(nums[num - 1]); } } for (int i = 0; i < n; ++i) { if (nums[i] > 0) { return i + 1; } } return n + 1; }
public static void main(String[] args) { int[] nums = {7, 8, 9, 11, 12}; System.err.println(firstMissingPositive(nums)); } }
|