使用散列表来降低时间复杂度

题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
 
 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     }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值