经典算法面试题:LeetCode两个有序数组中位数

Leetcode算法系列将详细讲解一些经典的面试算法题。

今天的算法是LeetCode中第四个题目,Median of Two Sorted Arrays,也就是给定两个有序数组求出中位数。

理解题意

首先给定的是两个有序数组,比如{1,3}以及{2},那么合并这两个数组就是{1,2,3},因此很显然中位数是2;

再给定两个数组{1,3}和{2,4},那么合并这两个数组就是{1,2,3,4},因此中位数就是(2+3)/2,也就是2.5;

理解了题意后该如何解决这个问题呢?

思路1:最直观解法

对于各种各样的算法题来说通常都会有一个最简单最直接的方法,在面试中如果你一下想不到最优解,那么首先提出一个最简单最直接的方案是比较好的方法,不要一下就去想最优解法,卡住后也不和面试官沟通,这会让面试官觉得你可能连最简单的解法都想不出来。

那么对于这个问题来说,最简单最直接的解法当然就是重新建立一个数组,然后按序合并这两个数组,这样我们就得到了一个完整的数组,比如对于{1,3}和{2}来说,我们对其进行合并这样就得到了{1,2,3},因为合并后的数组是有序的,因此我们可以直接计算出中位数。

上面的这种解法是相当直观的,让我们来分析一下这个题目的时间和空间复杂度,所谓“时间复杂度”是说对于给定数据规模你的算法需要多少次操作,比如数据规模是N个,你的算法对每个数据进行10次操作,那么你的时间复杂度就是10N,用算法的术语就是O(10N);而所谓“空间复杂度”是说对于给定的数据规模你的算法需要多少内存,比如数据规模是N个,你的算法对于每个数据的处理都要新开辟6个内存单元(这里的单元是依据具体情况的,可以是一个int,一个bool或者一个复杂的对象等),那么你的空间复杂度就是6N,即O(6N)。

有了时间和空间复杂度的概念,让我们来分析一下。

首先我们要开辟一个新的数组,该数组的长度是原来两个数组的和,假设这两个数组的长度是M和N,那么新的数组长度就是M+N,因此空间复杂度是O(M+N)。

创建出新的数组后我们要合并原来的两个数组,合并过程相对简单,只需要依次遍历一遍这两个数组即可,仅此时间复杂度也是O(M+N)。

显然最简单的解法过不了面试,那么该如何改进呢?

思路2:二分查找

注意这里给的是两个有序数组,对于有序数组的搜索来说最常用的就是二分搜索,二分搜索中每次都可以丢一半的数据,大大加快了搜索速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值