题解 | #数组中重复的数字#

数组中重复的数字

http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524

描述
        在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1

示例1
输入:[2,3,1,0,2,5,3]
返回值:2

方法一:利用set集合
核心思想:
        引入set集合,遍历数组元素,检查元素是否在集合中,不在则将元素插入到集合里面;否则表明当前元素在数组中重复,返回当前元素。

核心代码:

int duplicate(vector<int>& numbers) {
    set<int> s;
    for(int i=0;i<numbers.size();i++){
        if(s.count(numbers[i])>0)
            return numbers[i];
        else
            s.insert(numbers[i]);
    }
    return -1;
}

复杂度分析:
        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于引入额外的集合空间,因此空间复杂度为O(N),最坏的情况是数组中的元素都不重复。

时间复杂度O(N)
空间复杂度O(N)

方法二:数据重排
核心思想:
        重头到尾扫描数组S中的每一个元素,当扫描到第i个元素的时候,比较第i个元素位置的值m是否等于i,如果相等,则说明该元素已经在排好序的位置,继续扫描其他元素;如果不相等,先判断m是否等于S[m],相等则说明不同位置上的元素值相等,即元素重复。直接返回元素;否则交换m和S[m]将他们放置到排好序的位置

图解:
图片说明

核心代码:

int duplicate(vector<int>& numbers) {
    int i=0,n=numbers.size();
    while(i<n){
        if(numbers[i] == i){    //第i个位置的元素就是i
            i++;
            continue;
        }else{
            if(numbers[i] == numbers[numbers[i]])   //不同位置上出现了相同的元素,即元素重复
                return numbers[i];
            else
                swap(numbers[i],numbers[numbers[i]]);   //交换元素到对应的位置
        }
    }
    return -1;
}

复杂度分析:
        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于没有采用额外的数组空间,空间复杂度为O(1)
时间复杂度O(N)
空间复杂度O(1)

全部评论
这题有bug,如果数组里有一个数是10,但数组长度不到10,就会发生数组越界。
3 回复 分享
发布于 2022-02-27 12:06
numbers[numbers[i]]不越界??
1 回复 分享
发布于 2022-08-26 15:25 广东
方法一的时间复杂度应该是O(nlogn)
点赞 回复 分享
发布于 2024-05-11 17:31 北京
时间复杂度不是O(n)吧
点赞 回复 分享
发布于 2022-10-26 11:28 上海
如果数组里的元素有个大于6的是不是就歇菜了numbers[i]=7 那 numbers[numbers[i]]就超界了,所以这种解法就只适合于把数组给定成刚刚好的
点赞 回复 分享
发布于 2022-07-28 16:58
第二种重排数组最坏情况:2n。如果长度为6,则最坏情况数组[5,0,1,2,3,4]。
点赞 回复 分享
发布于 2022-07-13 19:46
假如:numbers 数组长度 n 在 (0, 10000) 的区间,numbers[i] 是 int 型的任何数,那当出现一个 numbers[i] = 100000000, 那不是要开一个这么巨长的数组?
点赞 回复 分享
发布于 2022-03-09 16:52
方法二数据重排里,如果数组中没有0,比如[2,3,1,5,2,5,3],那不是代码中的i一直无法自加,while变成死循环了吗?
点赞 回复 分享
发布于 2022-02-20 10:32

相关推荐

评论
108
20
分享

创作者周榜

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