数组中重复的数字
数组中重复的数字
http://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
题目思路解析:看到这道题,第一想法是双循环暴力解决,但实际我们仔细阅读题目会发现,数字的取值很特别!
这不是刚好对应下标么~想到这,恭喜你即将可以用到时间复杂度为O(n),空间复杂度为1的巧妙解法,那内部的思想是怎样的呢?
这道题主要想获得的是重复的数,假设,想在在下标为1的位置上刚好是1,而下标为2的位置上也是1,为了把下标为2的位置上的1放到1上,你会发现。。。噢,冲突了,这不就是重复嘛,妥妥的解决问题。
附上代码:
bool duplicate(int numbers[], int length, int* duplication) { for(int i=0;i<length;i++){ while(i!=numbers[i]){ if(numbers[i]==numbers[numbers[i]]){ *duplication = numbers[i]; return true; } swap(&numbers[i],&numbers[numbers[i]]); } } *duplication = -1; return false; } void swap(int* a,int* b){ int temp =*a; *a = *b; *b = temp; }
代码很短,请看题解的朋友们仔细研读,做算法题不能急,要了解背后的思想,第一次写题解请多多包涵和支持鸭!!!