Leetcode: Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
题意
两个排序好的数组num1和num2的大小分别为m和n,找到数组的中位数,算法整体时间复杂度应该为O(log (m+n))。
解题思路
方法1
找到两个排序数组的中位数,非常容易想到的方法就是遍历两个数组,从小到大的寻找。因为是中位数,可能出现在两个数之间,所以使用一个长度为(m+n)/2+1的数组保存遍历的数,最后直接取对应位置的数即可。
这种方法的思路很简单,但是在效率上不高,虽然时间复杂度还是O(log (m+n)),但是其实存在很多不必要的比较,因为已经知道需要寻找的是第几个数了,最后在leetcode上运行时间为7ms,仅超过5%的提交。
代码实现
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
方法2
还有一种使用参考二分法的做法来解这题。
对于两个长度为m和n的数组,从中找到第k小的数,取M[k/2]和N[k/2]两个数做比较,如果M[k/2]较大,那么目标在N[k/2]之后,继续在两个长度为m和n-k/2的数组中寻找第k/2小的数,反之亦然。如果取第i(i>k/2)个数比较M[i]和N[i],即使M[i]>N[i],那么目标数也可能会出现在n[i]之前。
在实现过程中还要考虑如果数组长度n小于k/2的时候,那就应该用n代替k/2。
最后在leetcode上提交运行时间为5ms,与大部分提交时间相同。
代码实现
1 | public int find(int[] arr1,int s1,int m,int[] arr2,int s2,int n,int k){ |