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

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

# 题目

image

# 思路

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

image

  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 };
View Code

# 复杂度

  • 时间复杂度为O(n)
  • 空间复杂度为O(1)

# 测试用例

  • 空指针
  • 数字超界
  • 不包含重复数字
  • 包含一个重复数字
  • 包含多个重复数字
原文地址:https://www.cnblogs.com/wanglei5205/p/9024943.html