您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2015-09-19 20:29 441 查看
今天去乐视笔试的一个题目。题目大意如下,给一个整数序列,找出其中没出现过的最小的正整数。

如输入:1,2,0。则未出现的最小正整数是3。

如输入:3,3,2,-1。则未出现的最小正整数是2。

要求时间复杂度O(N),空间复杂度是N(1)。

这个一开始确实是不知道怎么做,主要是这个复杂度限制。后来经过讨论,终于想到了一个办法。即采用本地数组的空间,将正整数k放在第k-1位。再重头过一遍,即可知道哪个数没出现过了。

具体代码如下。

[code]//最小的不存在的正整数
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: