JZ50 数组中重复的数字

数组中重复的数字

题目:

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

思路:

时间复杂度是O(n),空间复杂度是O(1),这个数组的特点是里面的元素都是0-n-1之间的数字,如果排好序之后,应该是每个位置上的元素都和下标相等。
依次扫描这个数组中的元素,对于下标i对于的元素为m,如果m != i,那么就将下标为m的元素和下标为i的元素进行交换,直到下标和对应的元素相等为止。
func duplicate(numbers []int) int {
    length := len(numbers)
    if length <= 0 {
        return -1
    }
    for i := 0;i < length; i++ {
       //必须首先判断 numbers[i] != i,不然考虑已经排好序的情况,0,1,2,3,4,i= 1,numbers[1] = 1;
        //肯定numbers[numbers[i]] == numbers[i],
        for numbers[i] != i {//可能2,1,1这种没有0的情况,那么就会
            if numbers[numbers[i]] == numbers[i]  {
                return numbers[i]
            }
            numbers[i], numbers[numbers[i]] = numbers[numbers[i]], numbers[i]
        }
    }
    return -1
}

 

posted @ 2021-04-10 20:55  zqlucky  阅读(38)  评论(0编辑  收藏  举报