数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
 
不改变数组结构的解法:
public static int findDup(int[] numbers) {
int length = numbers.length;
for (int i = 0 ; i < length; i++) {
int index = numbers[i];
if (index >= length) {
index -= length;
}
if (numbers[index] >= length) {
return index;
}
numbers[index] = numbers[index] + length;
}
return - 1 ;
}
 
改变数组结构的解法:时间复杂度O(n)

可以将值为 i 的元素放到第 i 个位置上.

从头到尾依次扫描这个数字中的每个数字,当扫描到下标为i的数字,首先比较这个数字(用m表示)是不是等于i,如果是,则继续扫描下一个,如果不是,就就拿它和第m个数字比较,如果它和第m个数字相等,就找到了一个重复的数字;如果不相等,就把第i个数字与第m个数字交换,把m放到属于它的位置,接下来再重复这个比较,交换的过程,直到我们发现一个重复的数字

position-0 : (2,3,1,0,2,5) // 2 <-> 1
      (1,3,2,0,2,5) // 1 <-> 3
      (3,1,2,0,2,5) // 3 <-> 0
      (0,1,2,3,2,5) // already in position
position-1 :  (0,1,2,3,2,5) // already in position
position-2 :  (0,1,2,3,2,5) // already in position
position-3 :  (0,1,2,3,2,5) // already in position
position-4 :  (0,1,2,3,2,5) // nums[i] == nums[nums[i]], exit

 

public static int findRepeatNumber(int[] nums){
if(nums.length==0){
return -1;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i]<0 || nums[i]>nums.length-1) {
return -1;
}
}
for (int i = 0; i < nums.length; i++) {
while(nums[i]!=i){ //
if(nums[i]==nums[nums[i]]){
return nums[i];
}
int tmp = nums[i];
nums[i]=nums[tmp];
nums[tmp]=tmp;
}
}
return -1;
}



int find_dup( int numbers[], int length) {

    for ( int i= 0 ; i<length; i++) {

        int index = numbers[i];

        if (index >= length) {

            index -= length;

        }   

        if (numbers[index] >= length) {

            return index;

        }   

        numbers[index] = numbers[index] + length;

    }   

    return - 1 ; 

}

posted @ 2018-10-11 17:42  MarkLeeBYR  阅读(96)  评论(0)    收藏  举报