给定一个未排序的数组,找出其中没有出现的最小正整数(num>=1)

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int size = nums.size();
        if(size <=0) return 1;
/*巧妙之处在这里,看似双重循环,其实只遍历了一遍数组,因为在内层交换过后,存在一部分i==a[i],当外层遍历到该元素,就不会进入循环内,相当于只遍历了一遍数组。*/
        for(int i=0;i<size;i++){
        //这里就是做简单交换,把大小为i的放到index=i的位置
        //因为size只有n,index=n-1,,那自然是0~n-1之间的数才能放到对应的位置
        //对于0就不管了;
        //当index为i的数nums【ℹ️】!=i时候,那就把当前nums【i】的数交换到正确的index位置即可;然后在当前i的位置while循环,不断交换;当两个要交换的位置数相等的时候说吗交换不了了,然后就结束这次的循环,去下一个位置找
            while(nums[i]>0&&nums[i]<size&&(i!=nums[i])){
                int t = nums[i];
                if(nums[t]==nums[i]) break;
                int tmp = nums[i];
                nums[i]=nums[t];
                nums[t] = tmp;
            }
        }


//找的是正整数,所以从下标为1的进行找即可,下标i就是我们要返回的结果。
        for(int i =1;i<size;i++){
            if(i!=nums[i])return i;
        }
//没找到的话,可能是n+1;或者是n本身。
//因为我没找到那必然不在0~n-1范围内,说说明至少是n;但是位置为0的那个我们没有便利,所以可能是n,那就得n+1了
        return size+(nums[0]==(size));
    }
};

https://blog.csdn.net/weixin_40846513/article/details/81212587?spm=1001.2014.3001.5506

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值