在给定的整数数组中找到重复的数字

本文介绍了两种检测数组中重复元素的有效方法。第一种方法使用哈希表,通过遍历数组并利用HashMap记录每个元素出现的次数,实现时间复杂度O(n),空间复杂度O(n)。第二种方法适用于数组元素范围在0到n-1的情况,通过原地交换元素并检查是否发生冲突,高效找出重复项。

方法一
hash表: 时间复杂度是O(n),空间复杂度O(n)

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] data= {2,3,1,0,2,5,3};
		HashMap<Integer,Integer> map=new HashMap<>();
		for(int i=0;i<data.length;i++) {
			//map.put 方法用于覆盖操作
			//一个Map中不能包含相同的key,每个key只能映射一个value,就自动覆盖了
			if(map.containsKey(data[i])) {
				map.put(data[i], map.get(data[i])+1);
			}else {
				map.put(data[i], 1);
			}
				
			map.forEach((key,value)->{
				if(value>1)
					System.out.println(key+":"+value);
			});
		}
	}

 
方法二

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。

思路:创建长度为n的数组,将数组的值存到与该值相等的指标数组下(我说的不好还是举个例子:如 data[3]=2,判断下data[2]的值是不是等于2 。如果是就说明重复了)

{2,3,1,0,2,5,3}

开始:

data[0]=2 不等于0 与 data[2]=1互换

结果:{1,3,2,0,2,5,3}

data[0]=1 不等于0 与 data[1]=3 互换

结果:{3,1,2,0,2,5,3}

data[0]=3 不等于0 与 data[3]=0 互换

结果:{0,1,2,3,2,5,3}

然后判断 data[0]=0 等于0 data[1]=1 等于1 …一直到data[4]=2,用data[data[i]==data[i]来判断data[i]==i,与4 不相等 看data[2]=2 与2相等 说明重复了。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int [] data= {2,3,1,0,2,5,3};
		HashMap<Integer,Integer> map=new HashMap<>();
		for(int i=0;i<data.length;i++) {
			//避免重复
			//{0,1,2,3,2,4} 当下标为4 即指向 2时判断2为重复数字,
			//然后计算数组2出现次数为2,当下标移到5是即指向4,换位后{0,1,2,3,4,2},
			//这时机器又会多判一次2,这样2的出现次数是3。
			while(data[i]!=i&&data[i]!=-1) {
				//如果重复了data[data[4]]==data[4],即data[2]==2
				if(data[data[i]]==data[i]) {
					if(map.containsKey(data[i]))
						map.put(data[i], map.get(data[i])+1);
					//在已经有一个的基础上加,所以是
					else
						map.put(data[i],2);
					data[i]=-1;
					break;
				}else {
					int temp=data[i];
					data[i]=data[data[i]];
					data[temp]=temp;
				}
			}
		}
		map.forEach((key,value)->{
			System.out.println(key+" "+value);
		});
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值