算法 2.4 归并排序 + 二分查找:寻找两个正序数组的中位数【leetcode 4】
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2
请你找出这两个正序数组的中位数
进阶:你能设计一个时间复杂度为 O(log(m + n)) 的算法解决此问题吗?
提示:
• 0 <= m、n <= 1000
• m+n >= 1
• -10 6 <= nums1[i] 、nums2[i] <= 10 6
首先将数组拆分成两部分
对这两部分分别递归排序
元素个数大于1,继续拆分
只有一个元素时无需排序,结束递归
在对有序数组进行两两合并
时间复杂度: O(nlogn)
• 需要递归的将数组切割 logn 次,然后进行两两归并,时间复杂度为 O(nlogn)
空间复杂度: O(n)
• 递归深度是 O(logn)
• 每次递归在合并时需额外辅助空间,长度与待排序的数组长度相等
• 每次递归都会释放掉所占的辅助空间,最大辅助空间为 O(n)
• 所以空间复杂度为 O(n+logn) = O(n)
使用折半的方式在有序数组中查找某一特定元素
每一次比较都使查找范围缩小一半
时间复杂度: O(m+n)
• 需要多次比较两个数组中元素的大小
• 只需要找到中间位置的元素,并不需要完成整个归并,总的比较次数为 (m+n)/2 + 1
• 时间复杂度为 O(m+n)
空间复杂度: O(1)
• 常数级的变量空间 O(1)
执行耗时:3 ms,击败了 69.10% 的Java用户
内存消耗:41 MB,击败了 24.82% 的Java用户
时间复杂度: O(log(min(m,n)))
• 只需要对 nums1 和 nums2 中较短数组进行二分查找
• 二分查找的时间复杂度为 O(log(min(m,n)))
空间复杂度: O(1)
• 常数级内存空间 O(1)
执行耗时:2 ms,击败了 100.00% 的Java用户
内存消耗:40.9 MB,击败了 35.53% 的Java用户