数组中重复的数字

数组中重复的数字

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;
    }

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:33
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务