美文网首页
2019-03-17 Median of Two Sorted

2019-03-17 Median of Two Sorted

作者: _伦_ | 来源:发表于2019-03-17 20:00 被阅读0次

暴力算法就是从两个数组开端开始扫描,知道index为中间的一个或者两个数,取得结果,代码如下:

class Solution {

public:

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        int smaller;

        int lastSmaller;

        int currentIndex = 0;

        int middle = (nums1.size() + nums2.size()) / 2;

        bool odd = (nums1.size() + nums2.size()) % 2 == 0;

        int i1 = 0; int i2 = 0;

        while (currentIndex <= middle) {

            lastSmaller = smaller;

            if (i1 < nums1.size() && i2 < nums2.size()) {

                int n1 = nums1.at(i1);

                int n2 = nums2.at(i2);

                if (n1 < n2) {

                    smaller = n1;

                    i1++;

                } else {

                    smaller = n2;

                    i2++;

                }

            } else if (i1 >= nums1.size() && i2 < nums2.size()) {

                smaller = nums2.at(i2);

                i2++;

            } else if (i1 <= nums1.size() && i2 >= nums2.size()) {

                smaller = nums1.at(i1);

                i1++;

            } else {

                throw "error!";

            }

            currentIndex++;

        }

        if (!odd) {

            return smaller;

        } else {

            return ((float)smaller + (float)lastSmaller) / 2;

        }

    }

};

方案二:

看了别人的博客,主要的点子就是转化为求第K大的数的问题,然后利用已排序的性质,做类似二分法的查找。比如有两个已排序数组,A,B。我们要求第K大的数。

我们可以直接比较A[K/2],B[K/2],分情况讨论如下:

2-1、A长度小于K/2,那肯定第K大的数在B中,具体为B[K - A.length - 1]

2-2、B长度小于K/2,那肯定第K大的数在A中,具体为A[K - B.length -1]

2-3、A[K/2] > B[K/2],那么B[K/2]之前的数肯定都比A[K/2]小。我们可以直接去掉这一部分(假设这部分长度为pb),则继续从A,B'(B'为B去掉前pb个数剩下的数组)找第K-pb大的数

2-4、同理,如果反过来的结果,则从A从去除一部分数,然后继续递归求结果

2-5、如果A[K/2]=B[K/2],则说明 A[K/2]就是第K大的数,直接返回(A[K/2]前面有K/2-1个数,B也一样,所以A[K/2]就是第K/2以及K/2-1个数

class Solution {

public:

double find(int *a, int n, int *b, int m, int k) {

if (n > m) return find(b, m, a, n, k);

else if (n == 0) return b[k - 1];

else if (k == 1) return min(a[0], b[0]);

int pa = min(k/2, n), pb = k - pa;

int diff = a[pa - 1] - b[pb - 1];

if (diff == 0) return a[pa - 1];

else if (diff < 0) return find(a + pa, n - pa, b, m, k - pa);

else return find(a, n, b + pb, m - pb, k - pb);

}

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

int total = nums1.size() + nums2.size();

if (total & 1) {

return find(nums1.data(), nums1.size(), nums2.data(), nums2.size(), total / 2 + 1);

} else {

return (find(nums1.data(), nums1.size(), nums2.data(), nums2.size(), total / 2 + 1)

+ find(nums1.data(), nums1.size(), nums2.data(), nums2.size(), total / 2) ) / 2;

}

    }

};

相关文章

网友评论

      本文标题:2019-03-17 Median of Two Sorted

      本文链接:https://www.haomeiwen.com/subject/ebtpmqtx.html