欢迎使用CSDN-markdown编辑器

今天去乐视笔试的一个题目。题目大意如下,给一个整数序列,找出其中没出现过的最小的正整数。
如输入:1,2,0。则未出现的最小正整数是3。
如输入:3,3,2,-1。则未出现的最小正整数是2。
要求时间复杂度O(N),空间复杂度是N(1)。
这个一开始确实是不知道怎么做,主要是这个复杂度限制。后来经过讨论,终于想到了一个办法。即采用本地数组的空间,将正整数k放在第k-1位。再重头过一遍,即可知道哪个数没出现过了。
具体代码如下。

//最小的不存在的正整数
int minNonExist(int[]arr){
    int next=-1;
    while(++next<arr.length){
        int tmp=arr[next];
        while(tmp>=1&&tmp<=arr.length&&arr[tmp-1]!=tmp){
            int t2=arr[tmp-1];
            arr[tmp-1]=tmp;
            tmp=t2;
        }
    }
    for(int k=0;k<arr.length;++k)
        if(arr[k]!=k+1)
            return k+1;
    return arr.length+1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值