两个有序数组的中位数,相当于寻找两个数组第k大的值,利用二分法进行查找,确定之后改变k的值与起始索引。
- Runtime: 120 ms, faster than 96.49%
- Memory Usage: 41.6 MB, less than 86.12%
var findMedianSortedArrays = function(nums1, nums2) {
let len1 = nums1.length
let len2 = nums2.length
let len = len1 + len2
if(len % 2 === 1) {
return findKthDouble(nums1, nums2, (len + 1 ) / 2)
} else {
return (findKthDouble(nums1, nums2, len / 2) + findKthDouble(nums1, nums2, len / 2 + 1)) / 2
}
};
var findKthDouble = function(nums1, nums2, k){
let len1 = nums1.length
let len2 = nums2.length
let index1 = 0
let index2 = 0
while (true) {
if (index1 === len1) {
return nums2[index2 + k - 1]
}
if (index2 === len2) {
return nums1[index1 + k - 1]
}
if(k === 1) {
return Math.min(nums1[index1], nums2[index2])
}
let half = Math.floor(k / 2)
let newIndex1 = Math.min(index1 + half, len1) - 1
let newIndex2 = Math.min(index2 + half, len2) - 1
let flag1 = nums1[newIndex1]
let flag2 = nums2[newIndex2]
if(flag1 <= flag2) {
k -= (newIndex1 - index1 + 1)
index1 = newIndex1 + 1
} else if (flag1 > flag2) {
k -= (newIndex2 - index2 + 1)
index2 = newIndex2 + 1
}
}
}
网友评论