【剑指offer】找出数组中任意一个重复的数字,C++实现

时间:2023-03-09 06:37:24
【剑指offer】找出数组中任意一个重复的数字,C++实现

原创博文,转载请注明出处!

# 题目

【剑指offer】找出数组中任意一个重复的数字,C++实现

# 思路

对于长度为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对应的数字是重复数字。

【剑指offer】找出数组中任意一个重复的数字,C++实现

【剑指offer】找出数组中任意一个重复的数字,C++实现
【剑指offer】找出数组中任意一个重复的数字,C++实现
  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)

# 测试用例

  • 空指针
  • 数字超界
  • 不包含重复数字
  • 包含一个重复数字
  • 包含多个重复数字