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 }