力扣 41. 缺失的第一个正数 C语言

题目分析

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值