剑指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 数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章