(这题虽然是困难的题,但是相对来说简单一点)
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
创建一个新的空数组(这个数组中存放的是nums和nums2的所有数,并且是升序排列的 ), 建立两个指针分别指向两个数组的开始,
let i = j = 0;
let set = [];
判断nums[i]和nums[j]的大小
nums1[i] > nums2[j] 则set.push(nums2[j]) ; j++;
否则set.push(nums1[i]) ; i++;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
set.push(nums1[i]);
i++;
} else {
set.push(nums2[j]);
j++;
}
}
nums1的长度和nums2的长度不一定相同,所以最后可能是有一个的没有遍历完,要把剩余的加入到set中
while (i < nums1.length) {
set.push(nums1[i]);
i++;
}
while (j < nums2.length) {
set.push(nums2[j]);
j++;
}
完整代码
var findMedianSortedArrays = function(nums1, nums2) {
let i = j = 0;
let set = [];
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
set.push(nums1[i]);
i++;
} else {
set.push(nums2[j]);
j++;
}
}
while (i < nums1.length) {
set.push(nums1[i]);
i++;
}
while (j < nums2.length) {
set.push(nums2[j]);
j++;
}
if(set.length % 2 == 1) {
return set[Math.floor(set.length / 2)]
} else {
return (set[set.length / 2] + set[set.length / 2 - 1]) / 2;
}
};