数组中重复的数字

数组中重复的数字

http://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8

题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

题目思路解析:看到这道题,第一想法是双循环暴力解决,但实际我们仔细阅读题目会发现,数字的取值很特别!
这不是刚好对应下标么~想到这,恭喜你即将可以用到时间复杂度为O(n),空间复杂度为1的巧妙解法,那内部的思想是怎样的呢?
这道题主要想获得的是重复的数,假设,想在在下标为1的位置上刚好是1,而下标为2的位置上也是1,为了把下标为2的位置上的1放到1上,你会发现。。。噢,冲突了,这不就是重复嘛,妥妥的解决问题。
附上代码:

bool duplicate(int numbers[], int length, int* duplication) {
        for(int i=0;i<length;i++){
            while(i!=numbers[i]){
                if(numbers[i]==numbers[numbers[i]]){
                    *duplication = numbers[i];
                    return true;
                }
                swap(&numbers[i],&numbers[numbers[i]]);
            }
        }
        *duplication = -1;
        return false;
    }
    void swap(int* a,int* b){
        int temp =*a;
        *a = *b;
        *b = temp;
    }

代码很短,请看题解的朋友们仔细研读,做算法题不能急,要了解背后的思想,第一次写题解请多多包涵和支持鸭!!!

全部评论

相关推荐

03-12 11:54
门头沟学院 Java
dghyuiok:佬太厉害了,我也27双非,只会黑马商城和苍穹外卖,靠这两个烂大街项目,装成大三面了4个一个没中
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务