/**
* 4.寻找两个正序数组的中位数
* 给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的 中位数 。
*
* 算法的时间复杂度应该为 O(log (m+n))
*
*/
public class Median {
public static double findMedianElement(int[] numArray1, int[] numArray2) {
int length1 = numArray1.length, length2 = numArray2.length;
int totalLength = length1 + length2;
//奇数
if (totalLength % 2 == 1) {
int midIndex = totalLength / 2;
double median = getElement(numArray1, numArray2, midIndex + 1);
return median;
} else {
//偶数
int midIndex1 = totalLength / 2 - 1, midIndex2 = totalLength / 2;
int k1 = getElement(numArray1, numArray2, midIndex1 + 1);
int k2 = getElement(numArray1, numArray2, midIndex2 + 1);
double median = ( k1 + k2 ) / 2.0;
return median;
}
}
public static int getElement(int[] numArray1, int[] numArray2, int k) {
int length1 = numArray1.length, length2 = numArray2.length;
int index1 = 0, index2 = 0;
//临时存储K
int kTemp = k;
//记录遍历次数
int count = 0;
while (true) {
//特殊情况,取第一个元素
if (k == 1) {
if (length1 == 0){
return numArray2[index2];
}
if (length2 == 0){
return numArray1[index1];
}
return Math.min(numArray1[index1], numArray2[index2]);
}
//元素初始值
int pivot1 = -99999, pivot2 = -99999;
//数组1,下标没有越界,且数组个数大于0
if (index1 <= length1 -1 && length1 > 0){
pivot1 = numArray1[index1];
}
//数组2,下标没有越界,且数组个数大于0
if (index2 <= length2 -1 && length2 > 0){
pivot2 = numArray2[index2];
}
//已经遍历了 k-1次 等同于 已经找到了目标元素
if(count == (kTemp-1)){
if (index1 > length1 - 1) {
return pivot2;
}
if (index2 > length2 - 1) {
return pivot1;
}
return Math.min(pivot1,pivot2);
}
//谁的元素小,谁移动指针
if ((pivot1 != -99999 && pivot2 != -99999 && pivot1 <= pivot2) ||
pivot2 == -99999
) {
//右移 nums1 指针
index1 += 1;
//记录遍历次数
count += 1;
} else {
//右移 nums2 指针
index2 += 1;
//记录遍历次数
count += 1;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。