不修改数组找出重复的数字

不修改数组找出重复的数字

题目

在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但是不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。

题解

思路1

由于不能修改输入的数组,我们可以创建一个长度为n+1的辅助数组,然后逐一把原数组的每个数字复制到辅助数组。

如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置。

如果下标为m的位置上已经有数字了,则说明该数字重复了。

由于使用了辅助空间,故该方案的空间复杂度是O(n)

static void findByCopyArray(int[] n){
    int[] cp = new int[n.length+1];

    //初始化
    for (int i = 0; i<n.length; i++)
        cp[i] = -1;

    for (int i = 0; i<n.length; i++){
        if (cp[n[i]] == -1)
            cp[n[i]] = n[i];
        else
            System.out.print(n[i]+" ");
    }
}
全部评论

相关推荐

鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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