给定两个大小为 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
方法:
其实这道题要求的复杂度还是蛮高的,所以必须用到二分搜索;另外这道题的思路和我上个星期上的算法设计的课二分枚举的思路一致,奈何,我却没有想到,嗯
我知道有log,且序列有序,一定要用二分查找,但是我却想不到该怎么用;这很显然,没有掌握套路。。。
学算法一定要有特定的思维模式,不然一上题目就晕头转向。乱七八糟~-------------------------某大学叫兽
好了,接下来正经将思路:
我认为一般每道题都有一个非常基础的求解框架,那就是枚举算法;有人一听枚举,就觉得low的不行,其实不然;枚举会给我们下手题目的最好路径,但至于你还要笨笨的暴力枚举还是在模型上进行优化,那就看你的实力了。
本题:
1. 选择枚举对象:二分法无疑,那么,i,j 就是两个数组A,B的对象,他们将数组进行再分;i ,j 的范围也要确定好,另外,i ,j 之间的关系也值得考虑。。
2. 二分枚举,利用循环机制 用 Whlie 上界大于下界控制: i = (上界+下界)/2 和( i++ / i -- ) 来更新 上界/下界
3. 一一验证: 这一步才是除了枚举对象的确立的又一关键,找到中位数,我们需要两个条件:i ,j 分别将A B两个有序数组划分成了两半;我们把它们的左边合在一起,右边合在一起;left ,right 两部分;这两部分,对于新的长序列来说,不一定要都是有序的,但:
① len(left) = len(right)
② max(left) < min(right)
(在这里我们只要保证:
4. 考虑细节及边界情况;一定要画图分析。
代码: