题目分析
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
做出这题超级激动,这道题写了我一个上午,想了很久,在力扣这道题显示的难度是:困难,看的时候还是有点怕的,但是看了别人做出来的也挺多的,就想尝试一下,于是在我写了这道题之后,无法抑制住自己激动的心情,决定发个博客把解题思路分享给大家吧
执行结果:通过
显示详情
执行用时 :0 ms,在所有 C 提交中击败了100.00%的用户
内存消耗 :7.1 MB, 在所有 C 提交中击败了80.64%的用户
int firstMissingPositive(int* nums, int numsSize){
//总的思路:
//我们先遍历一次,将大于0与小于numsSize+1的数组拿出来进行运算,可以极大简化写题的时间与空间,对不满足的数直接不处理。再进行排序,去重,最后直接比对得到结果,思路还是很清晰的。
int i=0;
int index=0;
//第一步:拿下所有满足条件的值,缩小范围
for(i=0;i<numsSize;i++)
{
if(nums[i]>0&&nums[i]<numsSize+1)
{
nums[index++]=nums[i];
}
}
//1.1判断是否存在满足的值,若为空,则返回1
if(index==0)
{
return 1;
}
//第二步:将满足条件的数进行排序
int j=0;
for(i=0;i<index-1;i++)
{
for(j=i+1;j<index;j++)
{
int temp=0;
if(nums[i]>nums[j])
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
//第三步:去除重复的值,对结果进行索引
int pdex=1;
for(i=1;i<index;i++)
{
if(nums[i]!=nums[i-1])
{
nums[pdex++]=nums[i];
}
}
//第四步:进行判断比对,看排序后的nums[i]是否等于i+1,不等即返回i
for(i=0;i<pdex;i++)
{
if(nums[i]!=i+1)
{
return i+1;
}
}
return pdex+1;
}