思路
//使用TreeSet进行两个数组间的排序,但由于Set容器会把重复元素去除掉,所以我们自定义一个能保留重复元素的Comparator再传入TreeSet,从而得到合并排列后含重的TreeSet,即可使用简单的计算得到中值,以下是具体实现
重写TreeSet的Comparator:
class mCom implements Comparator{
@Override
public int compare(Object o1, Object o2) {
int resc;
Integer i1=(Integer)o1;
Integer i2=(Integer)o2;
resc= i1.compareTo(i2);
//resc等于0为出现i1=i2,即出现重复元素,使resc=-1,将他排在左边,resc=1,结果也一样,因为i1=i2,在左或在右没有区别
if(resc==0)
{
resc=-1;
}
return resc;
} @Override
public boolean equals(Object obj) { return false; }}
实例化TreeSet时传入我们重写的Comparator:
TreeSet<Integer> ts=new TreeSet<>(new mCom());
接下来就只需要把TreeSet转换成toArray一下变为Integer数组即可用简单算法获取中值:
Integer a[]=ts.toArray(new Integer[0]);
int b=a.length/2;
if(a.length%2==0){
res=(a[b]+a[b-1])/2.0;
return res;
}else {
res=a[b];
return res;
完整代码如下:
LeetCodeMid.java
class Solution5 {
//重写Comparator中的compare告诉TreeSet如何排序
class mCom implements Comparator{
@Override
public int compare(Object o1, Object o2) {
int resc;
Integer i1=(Integer)o1;
Integer i2=(Integer)o2;
resc= i1.compareTo(i2);
if(resc==0){resc=-1;}
return resc;
}
@Override
public boolean equals(Object obj) { return false; }
}
//主方法
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//实例化TreeSet,传入我们的Comparator
TreeSet<Integer> ts=new TreeSet<>(new mCom());
double res;
//添加数组元素进入TreeSet
for(int i=0;i<nums1.length;i++){ ts.add(nums1[i]); }
for (int j=0;j<nums2.length;j++){ ts.add(nums2[j]); }
//把Tree转换为Integer数组
Integer a[]=ts.toArray(new Integer[0]);
//取中值
int b=a.length/2;
if(a.length%2==0){
res=(a[b]+a[b-1])/2.0;
return res;
}else {
res=a[b]; return res;
}
}
}