方法一
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);
});
}

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

被折叠的 条评论
为什么被折叠?



