# 【题库练习】04 寻找两个有序数组的中位数
题目地址@LeetCode-median-of-two-sorted-arrays (opens new window)
题意:
给定两个大小为 m 和 n 的有序数组
nums1
和nums2
。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设
nums1
和nums2
不会同时为空。示例1:
nums1 = [1, 3] nums2 = [2] 则中位数是 2.0
1
2
3
4示例2:
nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5
1
2
3
4
# 一、准备
题目已经给出有序数组和算法的时间复杂度必须为 O(log(m + n))。
# 时间复杂度
O(1)即为一次查找即能获取想要的结果,O(n)为要遍历所有元素才能获取想要的结果。
O(log n)则常出现在二分查找(也叫折半查找)中,因为每次查找都是一半长度一半长度的查找,比如查找一个长度为16的数组中某一元素,需要4
次,(1 / 2) ^ 4 = 1 / 16
,n = 16
,那么查找次数就是以2为底,n的对数->log n
。
那么O(log(m + n))中,m + n
即为两个有序数组的长度之和,该时间复杂度就意味着需使用二分/折半查找。
# 二、解
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let arr = [...nums1, ...nums2].sort((a, b) => a - b);// 将两个数组合并 并 排序
let length = arr.length;
// 如果数组长度为 奇数 取中间的哪一个,为 偶数 则取中间两个求平均
return length % 2 ? arr[Math.floor(length / 2)] : (arr[length / 2] + arr[length / 2 - 1]) / 2;
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
提交结果:
Time | Cache |
---|---|
144ms | 39.8MB |