Leetcode#4||Median of Two Sorted Arrays
2015-08-11 10:44
351 查看
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
if ((len1 + len2) % 2 == 0) {
return (findKthElement((len1 + len2) / 2 - 1, nums1, 0, len1 - 1, nums2, 0, len2 - 1) +
findKthElement((len1 + len2) / 2, nums1, 0, len1 - 1, nums2, 0, len2 - 1)) * 0.5;
} else {
return (double) findKthElement((len1 + len2) / 2, nums1, 0, len1 - 1, nums2, 0, len2 - 1);
}
}
private int findKthElement(int loc, int[] A, int aStart, int aEnd,
int[] B, int bStart, int bEnd) {
int aLen = aEnd - aStart + 1;
int bLen = bEnd - bStart + 1;
//cornor case.
if (aLen == 0) {
return B[bStart + loc];
}
if (bLen == 0) {
return A[aStart + loc];
}
if (loc == 0) {
return Math.min(A[aStart], B[bStart]);
}
int aLoc = aLen * loc / (aLen + bLen) + aStart;
//int bLoc = bLen * loc / (aLen + bLen) + bStart;
int bLoc = loc - aLoc - 1 + aStart + bStart;
if (A[aLoc] > B[bLoc]) {
loc = loc - (bLoc - bStart + 1);
bStart = bLoc + 1;
aEnd = aLoc;
} else {
loc = loc - (aLoc - aStart + 1);
aStart = aLoc + 1;
bEnd = bLoc;
}
return findKthElement(loc, A, aStart, aEnd, B, bStart, bEnd);
}
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
if ((len1 + len2) % 2 == 0) {
return (findKthElement((len1 + len2) / 2 - 1, nums1, 0, len1 - 1, nums2, 0, len2 - 1) +
findKthElement((len1 + len2) / 2, nums1, 0, len1 - 1, nums2, 0, len2 - 1)) * 0.5;
} else {
return (double) findKthElement((len1 + len2) / 2, nums1, 0, len1 - 1, nums2, 0, len2 - 1);
}
}
private int findKthElement(int loc, int[] A, int aStart, int aEnd,
int[] B, int bStart, int bEnd) {
int aLen = aEnd - aStart + 1;
int bLen = bEnd - bStart + 1;
//cornor case.
if (aLen == 0) {
return B[bStart + loc];
}
if (bLen == 0) {
return A[aStart + loc];
}
if (loc == 0) {
return Math.min(A[aStart], B[bStart]);
}
int aLoc = aLen * loc / (aLen + bLen) + aStart;
//int bLoc = bLen * loc / (aLen + bLen) + bStart;
int bLoc = loc - aLoc - 1 + aStart + bStart;
if (A[aLoc] > B[bLoc]) {
loc = loc - (bLoc - bStart + 1);
bStart = bLoc + 1;
aEnd = aLoc;
} else {
loc = loc - (aLoc - aStart + 1);
aStart = aLoc + 1;
bEnd = bLoc;
}
return findKthElement(loc, A, aStart, aEnd, B, bStart, bEnd);
}
}
相关文章推荐
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- javascript数组操作总结和属性、方法介绍
- mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
- JavaScript Array扩展实现代码
- JavaScript之数组(Array)详解
- C#中Array与ArrayList用法及转换的方法
- Array栈方法和队列方法的特点说明
- Array.prototype.slice 使用扩展
- Array, Array Constructor, for in loop, typeof, instanceOf
- 实例详解ECMAScript5中新增的Array方法
- js Array的用法总结
- JavaScript 判断判断某个对象是Object还是一个Array
- Javascript中的Array数组对象详谈
- js模拟实现Array的sort方法
- 在javascript将NodeList作为Array数组处理的方法
- PHP array_multisort()函数的使用札记
- PHP中array_merge和array相加的区别分析
- Sorting Array Values in PHP(数组排序)
- 深入array multisort排序原理的详解
- Array 重排序方法和操作方法的简单实例