算法系列——数组中的重复数字

来源:互联网 发布:淘宝加盟店可靠吗 编辑:程序博客网 时间:2024/06/11 03:32

题目描述

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

解题思路

排序法

直接对数组进行排序,然后遍历数组即可。
时间复杂度为O(nlogn).空间复杂度O(1)

哈希表

用哈希表统计每个数字出现的次数,然后遍历哈希表,找到所有次数大于1的数字。时间复杂度为O(n),空间复杂度为O(1)

运用数组的数据特征

我们注意到数组中的数字都在0到n-1的范围内。如果这个数组中没有重复的数字,那么当数组排序之后数字的i将出现在下标为i的位置。由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。

基本思路:
头到尾扫描数组每个数字,当扫描到下标为i的数字m时,首先比较m是不是等于i,如果是,继续扫描;如果不是,再拿m和第m个数字进行比较。如果他们相等,就找到第一个重复数字,如果不相等,交换两者位置。接下来重复上述过程,直到找到第一个重复数字。
时间复杂度为O(n),空间复杂度为O(1)

程序实现

   public boolean duplicate(int numbers[],int length,int [] duplication) {        if(numbers==null||length<=0)            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[0]=numbers[i];                      return true;                }                  //交换                int temp=numbers[i];                numbers[i]=numbers[numbers[i]];                numbers[temp]=temp;            }        }        return false;    }
原创粉丝点击