LeetCode 刷题:041,缺失的第一个整数
二哥瞎逼逼:人生最大的牢笼其实都是自己给的,以前我觉得刷 LeetCode 没多大用,也不需要,最近写 LeetCode 刷题笔记,反而得到了一些以前不曾有的快乐,尤其是对代码的一些逻辑推敲,感觉更清晰了。
题意
给你一个未排序的整数数组 nums
,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n)
并且只使用常数级别额外空间的解决方案。
难度
困难
示例
输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。
输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。
分析 1
我们先不考虑“时间复杂度为 O(n)
并且只使用常数级别额外空间”这个限制条件。
好,先搞清楚正数是什么?
正数是大于 0 的整数,那么我们可以直接暴力来解题。
- 获取数组的长度 n。
- 从 1 开始检查每个正整数是否存在于数组中,直到找到第一个不存在的正整数。
- 使用双重循环,外层循环遍历正整数 i,内层循环遍历数组 nums,检查 i 是否存在于数组中。
- 如果当前整数 i 不存在于数组中,返回 i。
也就是说,假如输入是 [1, 2, 0]
,那么我们就从 1 开始检查,1 存在于数组中,2 也存在于数组中,3 不存在于数组中,所以返回 3。
假如输入是 [3, 4, -1, 1]
,还是从 1 开始检查,1 ≠ 3,1≠4,1≠-1,1=1,好,1 存在于数组中,然后开始检查 2,很显然,2 不存在于数组中,所以返回 2。
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
// 从 1 开始检查每个正整数是否存在于数组中
for (int i = 1; i <= n + 1; i++) {
boolean found = false;
for (int j = 0; j < n; j++) {
if (nums[j] == i) {
found = true;
break;
}
}
// 如果当前整数 i 不存在于数组中,返回 i
if (!found) {
return i;
}
}
// 理论上不会执行到这里,因为我们在 for 循环中返回了结果
return n + 1;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums1 = {1, 2, 0};
int[] nums
真诚点赞 诚不我欺
回复