原创博文,转载请注明出处!
# 题目
# 思路
对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同。如果存在重复数字,则在排序的过程中会出现不同下标对应相同数字的情况。
举例:
数组2310253,下标0对应的数字是2,数字2与下标0不一致,交换下标0和下标2对应的数字,交换后的结果为1320253;
数组1320253,下标0对应的数字是1,数字1与下标0不一致,交换下标0和下标1对应的数字,交换后的结果为3120253;
数组3120253,下标0对应的数字是3,数字3与下标0不一致,交换下标0和下标3对应的数字,0123253。
数组0123253,下标4对应的数字是2,下标2对应的数字也是2,下标4对应的数字是重复数字。
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class Solution { 2 public: 3 /* 4 numbers数组 5 length数组长度 6 duplication重复数字 7 */ 8 bool duplicate(int numbers[], int length, int* duplication) 9 { 10 // 检查数组边界:空数组/长度小于0 11 if(numbers == nullptr || length <= 0) 12 return false; 13 14 // 检查数组元素:数组元素不符合题干 15 for(int i=0; i<length;++i) 16 { 17 if(numbers[i]<0 || numbers[i]>length-1) 18 return false; 19 } 20 21 /* 找出任意一个重复元素*/ 22 for(int i=0;i<length;i++) 23 { 24 while(numbers[i]!=i) 25 { 26 // 查找重复元素 27 if(numbers[i] != numbers[numbers[i]]) 28 { 29 int temp = numbers[i]; 30 numbers[i] = numbers[temp]; 31 numbers[temp] = temp; 32 } 33 else 34 { 35 *duplication = numbers[i]; 36 return true; 37 } 38 39 } 40 } 41 42 return false; 43 } 44 };
# 复杂度
- 时间复杂度为O(n)
- 空间复杂度为O(1)
# 测试用例
- 空指针
- 数字超界
- 不包含重复数字
- 包含一个重复数字
- 包含多个重复数字