热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js寻找两个数组的差集_[LeetCode]4.寻找两个有序数组的中位数

题目链接:力扣​leetcode-cn.com题目描述:给定两个大小为m和n的有序数组nums1和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度
a6374b28d46e2ce7b59a503179e274f0.png

题目链接:

力扣​leetcode-cn.com

题目描述:

给定两个大小为 m 和 n 的有序数组 nums1nums2

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1nums2 不会同时为空。

示例:

示例 1:

nums1 = [1, 3]
nums2 = [2]则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5

思路:

这道题如果时间复杂度没有限定在

,我们可以用
的算法解决,用两个指针分别指向两个数组,比较指针下的元素大小,一共移动次数为
(m+n + 1)/2​,便是中位数.

首先,我们理解到底什么是中位数,指的是该数左右两边数字的个数相等.

比如: odd : [1,| 2 |,3],2就是这个数组的中位数,左右两边都只要1位;

even: [1,| 2, 3 |,4],2,3就是这个数组的中位数,左右两边1位;

那么,现在我们有两个数组:

num1: [a1,a2,a3,...an]

nums2: [b1,b2,b3,...bn]

[nums1[:left1],nums2[:left2] | nums1[left1:], nums2[left2:]]

只要保证左右两边个数相同,中位数就在|这个边界旁边产生.

如何找边界值,我们可以用二分法,我们先确定num1m1左半边,那么num2m2 = (m+n+1)/2 - m1的左半边,找到合适的m1,就用二分法找,关于我的二分法总结,见另一篇文章.

[ [a1],[b1,b2,b3] | [a2,..an],[b4,...bn] ]

我们只需要比较 b3a2的关系的大小,就可以知道这种分法是不是准确的!

例如:我们令:

nums1 = [-1,1,3,5,7,9]

nums2 =[2,4,6,8,10,12,14,16]

m1 = 4,m2 = 3

median = (num1[m1] + num2[m2])/2

时间复杂度:

对于代码中边界情况,大家需要自己琢磨.

感觉对自己有用,就点个赞吧,并关注我的知乎专栏,嘻嘻!

代码:

python版

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:n1 = len(nums1)n2 = len(nums2)if n1 > n2:return self.findMedianSortedArrays(nums2,nums1)k = (n1 + n2 + 1)//2left = 0right = n1while left 0 else float("-inf"), nums2[m2-1] if m2 > 0 else float("-inf") )if (n1 + n2) % 2 == 1:return c1c2 = min(nums1[m1] if m1

c++版

class Solution {
public:double findMedianSortedArrays(vector& nums1, vector& nums2) {const int n1 = nums1.size();const int n2 = nums2.size();if(n1>n2) return findMedianSortedArrays(nums2, nums1);const int k = (n1 + n2 + 1)/2;int left = 0;int right = n1;while(left = n1 ? INT_MAX: nums1[m1],m2 >= n2 ? INT_MAX : nums2[m2]);return (c1 + c2) * 0.5;}
};

java版

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n1 = nums1.length;int n2 = nums2.length;if (n1>n2)return findMedianSortedArrays(nums2, nums1);int k = (n1 + n2 + 1)/2;int left = 0;int right = n1;while(left = n1 ? Integer.MAX_VALUE :nums1[m1],m2 >= n2 ? Integer.MAX_VALUE : nums2[m2]);return (c1 + c2) * 0.5;}
}

a136fe68c13055532ec44f5650b28130.png

同步更新博客:

一起刷LeetCode - 威行天下 - 博客园​www.cnblogs.com


推荐阅读
author-avatar
茴忆是抹不掉的伤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有