剑指offer 数组中重复的数字

Posted fdwzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 数组中重复的数字相关的知识,希望对你有一定的参考价值。

我的常规方法:

由于数组长度n,所有数据的大小都在0到n-1之间,所以考虑把每一位上的数字都放到应该呆的位置。如果nums[i]!=i并且nums[i]该呆的位置(nums[nums[i]])已经等于nums[i]了,说明出现了重复数字。

 1 class Solution {
 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         for(int i=0;i<length;++i){
11             if(numbers[i]==i){//第i位放i
12                 continue;
13             }
14             while(numbers[i]!=i and numbers[numbers[i]]!=numbers[i]){
15                 int temp=numbers[numbers[i]];
16                 numbers[numbers[i]]=numbers[i];
17                 numbers[i]=temp;
18             }
19             if(numbers[i]!=i){*duplication=numbers[i]; return true;}
20         }
21         return false;
22     }
23 };

评论区一个方法:

 1  bool duplicate(int numbers[], int length, int* duplication) {
 2  2     for(int i=0;i!=length;++i){
 3  3         int index=numbers[i]%length;
 4  4         if(numbers[index]>=length){
 5  5             *duplication=index;
 6  6             return 1;
 7  7         }              
 8  8         numbers[index]+=length;  
 9  9     }
10 10     return 0;
11 11 }

 

遍历到第i位,当前数字为nums[i],那么就在nums[i]索引处做一个标记,即将nums[nums[i]]加上数组的长度,以此作为标记,记录nums[i]这个数已经出现过了。

之后如果遍历到j(j>i),当前数字为nums[j],去检查nums[j]索引处是不是已经做过标记了(即nums[nums[j]]的值是否大于数组长度),如果做过标记了说明当前nums[j]就是一个重复出现的数字。

 

其实写到这,原理和我的方法是类似的,都是将遍历过的数字在对应索引位置做好记录,以备后期再查阅。时间复杂度同样都是O(N),只是这个方法不打印出来每次数组的结果,有些不好理解就是了。。

下面是运行截图,每次循环都打印一次数组的结果:

技术图片

 

以上是关于剑指offer 数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer03数组中重复的数字

剑指 Offer 03. 数组中重复的数字 的 详细题解

剑指offer数组中重复的数字

剑指offer五十之数组中重复的数字

剑指offer-数组中重复的数字

剑指offer 数组中重复的数字