面试题3:数组中重复的数字

来源:互联网 发布:马赛克复原软件 编辑:程序博客网 时间:2024/06/06 01:47

题目:在一个长度为n的数组里,所有数字都在0 - n-1范围内,数组中的某些数字是重复的,但不知道有几个重复的。请找出其中的任意一个重复数字。

举例:{2,3,1,0,2,5,3对应重复的数字为2或者3。

方法一,哈希表法:

    bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复        //与书上的解法不同 空间复杂度O(length) 时间复杂度为O(length)        vector<int > v;        v.resize(length);//确定容器大小        for(int i = 0; i < length; i++)        {            v[numbers[i]]++;            if(v[numbers[i]] >= 2)            {                *duplication = numbers[i];//                return true;            }        }        return false;    }
方法二,下标交换:

    bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复        //时间复杂度O(n),空间复杂度O(1)        if(length <= 0 || numbers == nullptr)            return false;        for(int i = 0; i < length; ++i)        {            if(numbers[i] >= length || numbers[i] <= 0)                return false;        }                for(int i = 0; i < length; ++i)        {            while(i != numbers[i])            {if(numbers[i] == numbers[numbers[i]])                {                    *duplication = numbers[i];                    return true;                }                                int tmp = numbers[i];                numbers[i] = numbers[numbers[i]];                numbers[tmp] = tmp;//这里要注意 不是numbers[numbers[i]] 而是numbers[tmp]            }        }        return false;            }

      

原创粉丝点击