[LeetCode]兩個排序陣列的中位數
阿新 • • 發佈:2018-11-03
思路
//使用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;
}
}
}