数组中重复的数字

在一个长度为 n 的数组里的全部数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每一个数字重复几回。请找出数组中任意一个重复的数字。java

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

要求时间复杂度是 O(N),空间复杂度是O(1),所以就不能使用排序、额外的标记数组。数组

对数组元素在 [0,n-1]问题,能够将值为 i 的元素调整到第 i 个位置上进行求解。 code

 


 

1.    把当前序列当成是一个下标和下标对应值是相同的数组;blog

2.    遍历数组,判断当前位的值和下标是否相等:排序

    2.1. 若相等,则遍历下一位;io

    2.2. 若不等,则将当前位置 i 上的元素和 a[ i ] 位置上的元素比较:若它们相等,则成功!    若不等,则将它们两交换。换完以后 a[ i ] 位置上的值和它的下标是对应的,但 i 位置上的元素和下标并不必定对应;重复2.2的操做,直到当前位置 i 的值也为 i,将 i 向后移一位,再重复2.class

 

public boolean duplicate(int[] nums, int length, int[] duplication) {
    if (nums == null || length <= 0)  //判空
        return false;
    for (int i = 0; i < length; i++) {   从 0 遍历
        while (nums[i] != i) {
            if (nums[i] == nums[nums[i]]) {  
                duplication[0] = nums[i];   //duplication[0],存放重复数的
                return true;
            }
            swap(nums, i, nums[i]);
        }
    }
    return false;
}

private void swap(int[] nums, int i, int j) {
    int t = nums[i];
    nums[i] = nums[j];
    nums[j] = t;
}
相关文章
相关标签/搜索