LeetCode 41. 缺失的第一个正数
Posted Blocking The Sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 41. 缺失的第一个正数相关的知识,希望对你有一定的参考价值。
题目描述
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
解题思路
思路1:原地置换
首先通过数学分析明确,缺失的正数和数组长度n的关系
两种可能:
1、缺失的正数落 在[1,n]中间,意味着,数组中必然有不在[1,n]的数字或在[1,n]范围内的重复数字。
2、缺失的正数大小超出了n,说明数组必然包括[1,n]区间的所有数字,无其他数字。
基于以上逻辑分析,可以原地修改数组,将原本数组中不在[1,n]的数字修改为n+2,以排除负数和0的影响。
代码
思路1:
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
//将不在[1,n]的数字替换为n+2;
for (int i = 0;i<n;++i){
if (nums[i] > 0&&nums[i]<=nums.size())
continue;
nums[i] = n+2;
}
for (int i = 0;i<n;++i)
{
//遍历当前数组,如果当前值的绝对值处于[1,n]中且nums[当前值的绝对值] > 0,说明之前没有遇到这个正数,将其置为负数,标识这个正数没有缺失
if (abs(nums[i]) > 0&&abs(nums[i])<=nums.size() && nums[abs(nums[i])-1] > 0){
nums[abs(nums[i])-1] = -nums[abs(nums[i])-1];
}
}
//经过遍历,所有[1,n]的正数对应的数组位置的值都为负数
for (int i = 0;i<n;i++)
{
//遍历数组,如果发现有位置大于0,说明数组之前没有这个值,输出该值
if (nums[i] > 0)
return i+1;
}
//如果数组都为负数,那缺失的值为数组长度+1
return n+1;
}
};
以上是关于LeetCode 41. 缺失的第一个正数的主要内容,如果未能解决你的问题,请参考以下文章