lintcode189-丢失的第一个正整数

题目描述:

如果不做空间的要求,可以利用哈希的思想,元素i放在下标为i的位置。然后遍历辅助空间,第一个没有赋值的就是答案。

要求常数级别的空间,排序就只能在原数组上进行。不是抹掉原来位置的元素,而是交换,使得下标为i的位置元素为i+1(正整数从1开始). 如果数组元素的范围都是数组长度范围内,交换完成以后,每一个元素都被交换到正确的位置。如果有大于数组长度的元素,那1~数组长度范围内肯定有空缺,交换完成以后,保证数组长度范围内的元素都在正确的位置上。然后寻找第一个下标和元素不对应的就是丢失的数。

代码:

int firstMissingPositive(vector<int> &A) {
        // write your code here
        for(int i=0; i<A.size();){
            if(A[i] == i+1)  //如果i位置就是对应的元素,跳过
                ++i;
            else{
                if(A[i] >=1 && A[i]<=A.size() && A[A[i]-1] != A[i]) //判断该元素是否是正整数,并且在数组长度范围内,并且是唯一的
                    swap(A[i], A[A[i]-1]);   //交换完成以后,i并不加一,因为换回来的元素还要进行判断
                else     //出现负数,大于数组元素范围的数, 重复的数,直接跳过
                    ++i;
            }
        }
        
        for(int i=0; i<A.size(); ++i){   //寻找第一个下标和元素不对应的数
            if(A[i] != i+1)
                return i+1;
        }
        return A.size()+1;    //如果都是对应的,则返回数组长度的下一个元素
    }
参考博客:https://blog.csdn.net/wangyuquanliuli/article/details/45749023



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值