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)。
创建出新的数组后我们