给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
解题思路:
- 判断数组中是否存在1,如果没有1则直接返回1,结束;
- 如果数组长度为1,同时数组中存在1,则直接返回2,结束;
- 将数组中小于1或者大于数组长度length的数变为1;
- 根据nums[i]的值将nums[nums[i]]对应的数变为负数,表示数组中存在该正数;因为nums[i]的值可能超过数组边界,因此当nums[i]=length时,使nums[0]变为负数;
- 遍历数组,当数组中某一个位置的值为正数,表示数组中缺少该位置值的整数,返回该位置的index,结束;注意nums[0]表示的是数组中是否存在length这个正数;
- 如果数组全为负数,则返回length+1,结束;
# Python3
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
if not nums: # 如果数组为空,返回1
return 1
length = len(nums) # 计算数组的长度
if 1 not in nums: # 如果1不在数组中,返回1
return 1
if length == 1: # 如果1在数组中,同时数组长度为1,则直接返回2
return 2
for i in range(length): # 数组中存在1,同时将小于1或者大于数组长度的值变为1
if nums[i]<=0 or nums[i]>length:
nums[i] = 1
# 将nums[i]对应的nums[nums[i]]变为负数,表示nums中存在nums[i]整数
# 因为nums[i]可能等于length,这超出了数组的范围,因此当nums[i]==length时,令nums[0]变为负数,nums[0]为负数表示数组nums中存在length这个正数
for i in range(length):
temp = abs(nums[i])
if temp == length:
nums[0] = -abs(nums[0])
else:
nums[temp] = -abs(nums[temp])
# 遍历数组,从1开始,如果存在nums[i]大于0,则直接返回1
for i in range(1,length):
if nums[i] > 0:
return i
# 判断nums[0]是否大于零,因为nums[0]为负数表示数组中存在正数length
# 当nums[0]大于零时,则返回length
if nums[0]>0:
return length
# 如果数组中前length个整数都存在,则返回length+1这个正数
return length+1
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.empty())
return 1;
int length = nums.size();
if(std::find(nums.begin(),nums.end(),1)==nums.end())
return 1;
if(length==1)
return 2;
for(int i=0;i<length;++i)
{
if(nums[i]<=0 || nums[i]>length)
nums[i] = 1;
}
for(int i=0;i<length;++i)
{
int temp = abs(nums[i]);
if(temp<length)
nums[temp] = -(abs(nums[temp]));
else
nums[0] = -(abs(nums[0]));
}
for(int i=1;i<length;++i)
{
if(nums[i]>0)
return i;
}
if(nums[0]>0)
return length;
return length+1;
}
};