[LeetCode/LintCode] 题解丨阿里巴巴面试原题:两个排序数组的中位数

2020-09-01 19:34:24 +08:00
 hakunamatata11

两个排序的数组 A 和 B 分别含有 m 和 n 个数,找到两个排序数组的中位数,要求时间复杂度应为 O(log (m+n))。

在线评测地址:

点击查看更多解法

说明

中位数的定义:

如果有数组中有 n 个数且 n 是奇数,则中位数为 A[(n-1)/2]

如果有数组中有 n 个数且 n 是偶数,则中位数为 (A[n / 2] + A[n / 2 + 1]) / 2

样例 1

输入:
A = [1,2,3,4,5,6]
B = [2,3,4,5]
输出: 3.5

样例 2

输入:
A = [1,2,3]
B = [4,5]
输出: 3

算法:归并

解题思路

算法流程

复杂度分析

时间复杂度:O(m+n),m 和 n 分别是两个数组的长度。双指针遍历两个数组,指针移动次数是 0(m+n)级。

public class Solution {
    /*
     * @param A: An integer array
     * @param B: An integer array
     * @return: a double whose format is *.5 or *.0
     */
    public double findMedianSortedArrays(int[] A, int[] B) {
        int m = A.length, n = B.length;
        int p1 = 0, p2 = 0;
        int left = -1, right = -1;
        for (int i = 0; i < (m + n) / 2 + 1; i ++){
            left = right;
            // p2 右移
            if (p1 >= A.length || p2 < B.length && A[p1] > B[p2]){
                right = B[p2++];
            }
            // p1 右移
            else {
                right = A[p1++];
            }
        }
        return (m + n) % 2 == 1 ? right : (left + right) / 2.0;
    }
}

二分和快速选择等更多解法见:

点击查看更多解法

628 次点击
所在节点    程序员
2 条回复
Still4
2020-09-02 10:12:54 +08:00
想了半天既然是排过序的数组,时间复杂度为什么是 O(log (m+n)),结果看解答里面果然是 O(m+n)
Still4
2020-09-02 10:20:13 +08:00
所以其实解法根本没有达到题目的要求啊,logn 的时间复杂度,只能用二分法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703282

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX