这是leetcode上的一道题目。求这两个以排序数组的中位数。
分析:
第一步:先根据2个数组加起来的总长度是奇数还是偶数来判断最终的中位数是一个数还是2个数相加取平均值。
第二步:设置2个指针,分别指向这两个数组的起始位置。然后不断进行比较这两个指针指向的值以更新这两个指针(下面程序已经有说明)。需要注意的是当指针指到数组末尾时该如何操作。
注:另外返回的时double型的结果。返回的结果要 是如下形式: (left+right)/2.0;
而不是 (left+right)/2;
public class Main {
public static void main(String []args) {
int []num1 = {};
int []num2 = {3,4};
double res = findMedian(num1,num2);
System.out.print(res);
}
private static double findMedian(int[] num1, int[] num2) {
int len1 = num1.length;
int len2 = num2.length;
int sum = len1+len2;
int first = sum%2==0?sum/2-1:sum/2;
int second = sum%2==0?sum/2:first;
int length = second+1;
int index1=0;
int index2=0;
int left = 0;
int right = 0;
int buff = 0;
if(num1.length==0) {
return (num2[first]+num2[second])/2.0;
}
if(num2.length==0) {
return (num1[first]+num1[second])/2.0;
}
for(int i=0;i<length;i++) {
if(index1==num1.length) {
buff = num2[index2];
index2 ++;
}
else if(index2 == num2.length){
buff = num1[index1];
index1++;
}
else if(num1[index1]>num2[index2]){
buff = num2[index2];
index2 ++;
}
else{
buff = num1[index1];
index1 ++;
}
if(i==first) {
left = buff;
}
if(i==second) {
right = buff;
}
}
return (left+right)/2.0;
}
}