找出两个数组的相同元素,最优算法?
在做新旧接⼝交替过程中,遇到了⽼接⼝和新接⼝json数据有些不⼀致的情况,需要⽐较两个json对象,把相同的元素赋其中⼀个json对象中变量的值。⽽且其中⼀个json最后输出格式还需要改变下属性名,思来想去觉得和“找出两个数组相同元素”很像,所以做下总结。
“有⼀个数组A{0,2,3,5}和⼀个数组B{3,5,6,2,1,1},找出这两个数组相同元素。”
⼀开始抽象出这道题时,脑海⾥浮现出最简单粗暴的⽅法,逐⼀⽐较。
//最简单粗暴的做法,逐个⽐较,时间复杂度为(B.length)^(A.length),b的a次⽅了,时间复杂度相当⾼
for(int i = 0 ;i < A.length ; i ++){
for(int j = 0 ;j < B.lengh;j++){
if( A[i] == B[j] ){
System.out.println(A[i]);
}
}
}
人物小传怎么写后⾯脑⼦⼀转,可以先排序再进⾏⽐较,排序的话,⽤最慢的冒泡排序法,时间复杂度是(B.length)^2+(A.length)^2+(⼀些莫名其妙的⽐较算法),总之时间复杂度⽐上⾯那个算法低就是了。这是第⼆种算法,就不贴代码了。
第三种算法,思路是先把两个数组合并,再排序⼀下,重复的元素⾃然就出来了,⽽⾄于说B数组⾥⾯本来就有重复元素,这个简单,把B数组先去重再和A数组合并就⾏了。
就是说B数组{3,5,6,2,1,1},经过去重后变成{3,5,6,2,1}
qq验证码
public void deDuplication(int[] oraginalArr){
for(int i = 0 ; i < oraginalArr.length ;i++){
if(int[i]==int[i+1]){
System.out.println(int[i]);
}
}
}
//⽤最慢的冒泡排序法,从⼩到⼤排列
public int[] sort(int[] messyArr){
for(int i = 0 ;i < messyArr.length ;i++){属相相生相克
for(int j = (i+1) ; j < (messyArr.length) ; j++ ){
//如果第⼀个数⽐第⼆个数⼤,则两数交换
if(messyArr[i] > messyArr[j ]){
int temp = messyArr[i];
messyArr[i] = messyArr[j ];
90后创业成功人士
才貌双全
messyArr[i+1] = temp;
}
}
return messyArr;
}戴敦邦
这样⼦时间复杂度⼀下⼦就变成了B.length+(B.length)^2,这就是算法的魅⼒。
夏目友人帐6⽹上⼜查了⼀些资料,还有⼀个⽤堆排序来找出两数组的相同元素的,时间复杂度在n(log2n)左右,感觉时间复杂度应该是最低的吧。
梦见大学室友
⾄于⽤HashMap,HashSet去重的,我感觉这些集合内部应该也是⽤了某种算法吧,感觉还是⾃⼰写的算法可以计算时间复杂度⽐较好⼀点,性能⼀算就知道了,如果有⼩伙伴能分析hashMap和hashSet去重的时间复杂度,欢迎探讨,谢谢。