leetcode 41. 缺失的第一个正数(找出一堆数的mex 直接将数放在应该放的位置 思维)

题目
在这里插入图片描述
比如[3,4,-1,1]:首先数中的 <=0 或者 >n的数都是没用的。就不管他们。
3不该在1这个位置。将-1和3换一下[-1,4,3,1]。由于是-1所以不管了。
4不该在2这个位置。将4和1换一下[-1,1,3,4]。换来了1,1也不该在2这个位置,将-1和1换一下[1,-1,3,4]。2这个位置现在是-1,我们不管他。
3,4位置分别是应该的数。
处理完了,最后扫一遍,哪个位置没有相应的数 就返回该位置下标。否则返回n+1;
注意假如 交换的两个位置上的数相等的话,不需要交换了,交换就是死循环了,这个数没用我们就不管他。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n=nums.length;
        for(int i=0;i<n;++i){
            while(nums[i]<=n&&nums[i]>0&&nums[i]!=(i+1)){
                int k=nums[i];
                if(nums[k-1]==nums[i]) break; //样例为[1,1]时,假如二者相等,说明k-1位置上的数
                int tmp=nums[k-1];//已经正确了,这个数相当于是没用的数了。
                nums[k-1]=nums[i];nums[i]=tmp;
            }
        }
        for(int i=0;i<n;++i) if(nums[i]!=(i+1)) return (i+1);
        return (n+1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值