1 /* 2 *思路: 3 *查找数组中重复的数字: 4 *这题有明确定义数组中的数字大小不超过数组的长度并且大于0,所以可以用位图来做,这样应该不会内存越界 5 * 6 *位图: 7 *即申请一个数组长度的位图数组,并初始化为0,正好可以以数组的下标作为每个数字的索引,然后位图数组的值作为该索引位置数字出现的次数. 8 *最后扫一遍位图数组,找到第一个值大于1的即可. 9 * 10 *可以用java的数据结构HashMap做,不过就没什么意思了,都没有用到题目的特性. 11 *编程就是应该特殊情况考虑特殊的数据结构. 12 */ 13 14 public boolean duplicate(int numbers[],int length,int [] duplication) 15 { 16 if(length <= 1) 17 { 18 return false; 19 } 20 21 int bitMapNumber[] = new int[length]; 22 23 for(int i = 0; i < length; i++) 24 { 25 bitMapNumber[i] = 0; 26 } 27 28 for(int i = 0; i < length; i++) 29 { 30 bitMapNumber[numbers[i]]++; 31 } 32 33 for(int i = 0; i < length; i++) 34 { 35 36 if(bitMapNumber[i] > 1) 37 { 38 duplication[0] = i; 39 40 return true; 41 } 42 43 } 44 45 return false; 46 }
你可能不知道位图,但是它真的很有用,特殊情况可以使时间复杂度降低不是一两个档次那么简单...
原文:http://www.cnblogs.com/daimadebanyungong/p/5024343.html