题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
方法一:
从0位置遍历,开辟一个lenght大小的数组,统计每个数字出现的次数,当某个数字出现的次数大于1时,则是第一个重复数字
从0位置遍历,开辟一个lenght大小的数组,统计每个数字出现的次数,当某个数字出现的次数大于1时,则是第一个重复数字
缺点:需要开辟lenght大小的额外空间
方法二:
在原数组上进行交换排序,因为题目原意为:数字保证为0-n-1,【代码中我没有判断不是这种情况】,那么排序时,一定是i位置数字为i,在交换中碰到了重复数字,则输出
1 class Solution01 { 2 public: 3 // Parameters: 4 // numbers: an array of integers 5 // length: the length of array numbers 6 // duplication: (Output) the duplicated number in the array number 7 // Return value: true if the input is valid, and there are some duplications in the array number 8 // otherwise false 9 bool duplicate(int numbers[], int length, int* duplication) { 10 vector<int>v(length, 0); 11 for (int i = 0; i < length; ++i) 12 { 13 v[numbers[i]]++; 14 if (v[numbers[i]] > 1) 15 { 16 *duplication = numbers[i]; 17 return true; 18 } 19 } 20 return false; 21 } 22 }; 23 24 25 class Solution02 { 26 public: 27 // Parameters: 28 // numbers: an array of integers 29 // length: the length of array numbers 30 // duplication: (Output) the duplicated number in the array number 31 // Return value: true if the input is valid, and there are some duplications in the array number 32 // otherwise false 33 bool duplicate(int numbers[], int length, int* duplication) { 34 for (int i = 0; i < length; ++i) 35 { 36 while (numbers[i] != i) 37 { 38 if (numbers[i] == numbers[numbers[i]]) 39 { 40 *duplication = numbers[i]; 41 return true; 42 } 43 swap(numbers[i], numbers[numbers[i]]); 44 } 45 } 46 return false; 47 } 48 };