数组中重复的数

来源:互联网 发布:手机商城模板php 编辑:程序博客网 时间:2024/04/29 06:54

题目描述

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

/*1、判断输入数组有无元素非法2、从头扫到尾,只要当前元素值与下标不同,就做一次判断,numbers[i]与numbers[numbers[i]],相等就认为找到了重复元素,返回true,否则就交换两者,继续循环。直到最后还没找到认为没找到重复元素,返回false*/class Solution {public:    // Parameters:    //        numbers:     an array of integers    //        length:      the length of array numbers    //        duplication: (Output) the duplicated number in the array number    // Return value:       true if the input is valid, and there are some duplications in the array number    //                     otherwise false    bool duplicate(int numbers[], int length, int* duplication) {        if(length<=0||numbers==NULL)            return false;        //判断每一个元素是否非法        for(int i=0;i<length;++i)        {            if(numbers[i]<=0||numbers[i]>length-1)                return false;        }        for(int i=0;i<length;++i)        {            while(numbers[i]!=i)            {                if(numbers[i]==numbers[numbers[i]])                {                    *duplication = numbers[i];                    return true;                }                //交换numbers[i]和numbers[numbers[i]]                int temp = numbers[i];                numbers[i] = numbers[temp];                numbers[temp] = temp;            }        }        return false;             }};

代码中尽管有一个两重循环,但是每个数字最多只要交换两次就能找到属于他自己的位置,因此总的时间复杂度为O(N)。另外,所有的操作步骤都是在输入数组上进行的,不需要额外分配内存,因此空间复杂度为O(1)。