每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)
今日问题:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例 1:
nums1 = [1,3]
nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1,2]
nums2 = [3,4]
中位数是 (2 + 3)/2= 2.5
解决方法:
暴力算法的改进算法:
不需要真正的合并两个数组,只需要找得到它的位置。
First:奇偶情况合并,如果是奇数,我们需要知道第 (len + 1)/2 个数就可以了,仅遍历 int ( len / 2 ) + 1 次。如果是偶数,我们需要知道第 len / 2 和 len / 2 + 1 个数,也是要遍历 len / 2 + 1 次。故综上奇偶数都需要遍历len / 2 + 1 次。
Second:我们用nums1Start和nums2Start分别表示当前指向nums1数组和nums2数组的位置。如果nums1Start没有遍历到最后并且当前nums1位置的数值小于nums2位置的数值,则向后遍历,nums1Start < m && num1[nums1Start] < nums2[nums2Start]。如果num2数组遍历完,而num1数组仍未结束,则会产生数组越界,则须判断num2Size是否大于数组长度,这样的话,||后面的就不用执行啦。即:num1Start < m && ( num2Start >= n|| num1 [ num1Start ] < num2 [ num2Start ] )。
Third:奇数返回最后一次遍历的结果,偶数则返回最后一次和上一次遍历结果的平均值。
C++代码:
C代码:
Java代码:
明日题目预告:
两个排序数组的中位数III
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例 1:
nums1 = [1,3]
nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1,2]
nums2 = [3,4]
中位数是 (2 + 3)/2= 2.5