前言
因为5月太忙了,没啥时间整理所学的知识啦,就发一些之前做的LeetCode算法解题思路。
题目:寻找两个正序数组的中位数
题目来源:寻找两个正序数组的中位数 - 力扣(LeetCode)
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入: nums1 = [1,3], nums2 = [2]
输出: 2.00000
解释: 合并数组 = [1,2,3] ,中位数 2
示例 2:
输入: nums1 = [1,3], nums2 = [2]
输出: 2.00000
解释: 合并数组 = [1,2,3] ,中位数 2
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
\-106 <= nums1\[i], nums2\[i] <= 106
解题思路
- 先进行数组合并
- 判断数组长度是奇数还是偶数
- 如果是奇数就直接用排序好的数组进行-1除以2获取中位数
- 偶数的话比较麻烦一点,需要获取到中间两位数
- 排序的时候不能直接用sort,需要为sort加个函数确保数组中有负数时排序不会混乱
代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
//定义一个数组来接收合并后的数组
let data = [];
//我认为这是一个细节,用长的数组去合并短的数组可以提高一些性能
//判断哪个数组比较长,然后map一遍用长的数组去合并端的数组
if (nums1.length <= nums2.length) {
nums1.map((item) => nums2.push(item));
data = nums2;
} else {
nums2.map((item) => nums1.push(item));
data = nums1;
}
//判断数组的长度是奇数还是偶数
let j = data.length % 2 === 1 ? 1 : 0;
//定义一个值来接收计算后取到的值
let returnData = 0;
if (j === 0) { //如果是偶数就取中间两位数取平均值
returnData =
(data.sort(prepare)[data.length / 2] + data.sort(prepare)[data.length / 2 - 1]) / 2;
} else { //如果是奇数就取最中间的数
returnData = data.sort(prepare)[(data.length - 1) / 2];
}
return returnData //返回中位数
//定义一个函数来确保sort排序不被负数影响,避免造成混乱
function prepare(a, b) {
if (a > b) {
return 1;
} else if (a === b) {
return 0;
} else if (a < b) {
return -1;
}
}
};