【leetcode4】用分治算法计算中位数问题

此题在leetcode中评级为hard,目的是在O(log(m+n))的时间复杂度情况下解决问题。用常规O(m+n)的算法很容易求得结果,但

显然不符合时间复杂度的要求。因此,这道题的解题分析主要还是利用分治算法去考虑,这也是本题的难点所在。

一、原题叙述

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)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

二、思路分析

题目中需要求出的结果是中位数,中位数的特点是其以后的数都比它大,前面的数都比它小。又因为两个数组都已经是有序数组,

因为我们所需要的结果就是数组a中的第i个元素和数组b中第j个元素,使得i+j-2等于两个数组长度和的一半,所以此题就可以转换成求i

j这两个值的问题了。在数组a中确定i以及在数组b中确定j,此时可以采用二分查找的方法,通过不断缩小查找范围来确实所需要

查找的值,也符合题目中所要求的分治算法的思想。

三、算法实现

class Solution {
public:
    int getkth(int s[], int m, int l[], int n, int k){
        //确保m < n 
        if (m > n) 
            return getkth(l, n, s, m, k);
        if (m == 0)
            return l[k - 1];
        if (k == 1)
            return min(s[0], l[0]);
	//递归过程
        int i = min(m, k / 2), j = min(n, k / 2);
        if (s[i - 1] > l[j - 1])
            return getkth(s, m, l + j, n - j, k - j);
        else
            return getkth(s + i, m - i, l, n, k - i);
        return 0;
    }
    
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        //总长度的一半
        int l = (m + n + 1) / 2;
        int r = (m + n + 2) / 2;
        return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0;
    }
};

四、个人心得

主要是要理解分治算法的核心思想,将一个大问题分解为几个小问题的分别解决,将这种思想跟题目结合起来就比较容易得出

结果了,通过二分法不断缩小查找范围,直至得到所要的结果然后返回。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/codekiller_/article/details/61419120
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞