剑指offer——01数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
 
方法一:
  从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 };

猜你喜欢

转载自www.cnblogs.com/zzw1024/p/11650464.html