leetCode算法—4.寻找两个正序数组的中位数
2023-12-16 04:51:02
1.给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
2.解法
export const findMedianSortedArrays = function (nums1, nums2) {
//保证nums1长度小于nums2,因为他们的分隔线位置互相影响
if (nums1.length > nums2.length) {
[nums1, nums2] = [nums2, nums1];
}
//取长度
let m = nums1.length, n = nums2.length;
//在0~m区域
let left = 0, right = m;
//暂存左半段的最大值,右半段的最小值
let median1 = 0, median2 = 0;
while (left <= right) {
//找nums1这里的中位线作为分隔线
const i = left + Math.floor((right - left) / 2);
//想象两个数组合并成一个新数组的总长度取中位线 - 左半段的分隔线,就是右半段分隔线的初始位置
const j = Math.floor((m + n + 1) / 2) - i;
//判断特殊情况,比如num1的中位线就是在下标0处,那么这分隔线也就缺乏意义了。
const maxLeft1 = i === 0 ? -Infinity : nums1[i - 1];
const minRight1 = i === m ? Infinity : nums1[i];
const maxLeft2 = j === 0 ? -Infinity : nums2[j - 1];
const minRight2 = j === n ? Infinity : nums2[j];
console.log({ i, j, maxLeft1, minRight1, maxLeft2, minRight2 })
//不停通过二分查找调整分隔线的位置,直到找到对应的数组,然后取中间值
if (maxLeft1 <= minRight2) {
median1 = Math.max(maxLeft1, maxLeft2);
median2 = Math.min(minRight1, minRight2);
left = i + 1;
} else {
right = i - 1;
}
console.log({ median1, median2 })
}
return (m + n) % 2 == 0 ? (median1 + median2) / 2 : median1;
};
欢迎大家给出更好的解法!!!
上一篇:leetCode算法—3.无重复字符的最长子串
下一篇:
文章来源:https://blog.csdn.net/weixin_43169949/article/details/135022120
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!