【leetcode hot 100 41】缺失的第一个整数
解法一:先排序,后查找。若nums[i]==num
,则更新当前最大数;若nums[i]>num
,则num不存在,为结果。
class Solution {
public int firstMissingPositive(int[] nums) {
Arrays.sort(nums);
int num = 1;
for(int i=0;i<nums.length;i++){
// nums[i]<num 不操作
if(nums[i]==num){
num=nums[i]+1;
}
if(nums[i]>num){
break;
}
}
return num;
}
}
解法二:遍历第一遍,将每个数放到它对应的索引位置上(即 1 放在 nums[0],2 放在 nums[1] 以此类推)。遍历第二遍,第一个不满足条件的位置就是缺失的最小正整数。
遍历数组,如果 nums[i] 是正数且在范围内(即 1 到 n),并且不在正确的位置上(即 nums[i] != nums[nums[i] - 1]
),则交换它和它正确位置上的数。
遍历数组,第一个位置 i,使得 nums[i] != i + 1
,则 i + 1 就是缺失的最小正整数。
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
// 将每个数放到正确的位置上
for (int i = 0; i < n; i++) {
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
// 交换 nums[i] 和 nums[nums[i] - 1]
int temp = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
}
}
// 寻找第一个不满足条件的位置
for (int i = 0; i < n; i++) {
if (nums[i] != i + 1) {
return i + 1;
}
}
// 如果所有位置都满足条件,则返回 n + 1
return n + 1;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums1 = {1, 2, 0};
int[] nums2 = {3, 4, -1, 1};
int[] nums3 = {7, 8, 9, 11, 12};
System.out.println("缺失的第一个正数: " + solution.firstMissingPositive(nums1)); // 输出 3
System.out.println("缺失的第一个正数: " + solution.firstMissingPositive(nums2)); // 输出 2
System.out.println("缺失的第一个正数: " + solution.firstMissingPositive(nums3)); // 输出 1
}
}