zoukankan      html  css  js  c++  java
  • LeetCode OJ--Median of Two Sorted Arrays ***

    http://oj.leetcode.com/problems/median-of-two-sorted-arrays/

    找两个有序数组的中位数,因为有序数组,并且复杂度要求O(lg(m+n))所以想到了使用二分,但具体怎么做,没分析清楚。

    参考了网上http://blog.csdn.net/zxzxy1988/article/details/8587244 ,其他的类似找两个有序数组中第 k 大的也可以这样处理。

    #include <iostream>
    using namespace std;
    
    double findKth(int a[],int m,int b[],int n,int k)
    {
        if(m>n) //总是让a中个数小于b中个数
            return findKth(b,n,a,m,k);
        if(m == 0) //一个数组为空了,只需要在b中求第k个
            return b[k-1];
        if(k == 1) //就差一个数了
            return min(a[0],b[0]);
        int pa = min(k/2,m), pb = k - pa;  //好写法
        if(a[pa - 1]<b[pb-1]) //a中的pa个可以都算进来了
            return findKth(a+pa,m-pa,b,n,k-pa); //a+pa,m-pa来表示,good
        else if(a[pa-1]>b[pb-1])
            return findKth(a,m,b+pb,n-pb,k-pb);
        else //如果相等
            return a[pa - 1];
    }
    class Solution {
    public:
        double findMedianSortedArrays(int A[], int m, int B[], int n) {
            int total = m + n;
            if(total & 0x1) //如果一共有奇数个
                return findKth(A,m,B,n,total/2+1);
            else //中位数 如果有偶数个数据,那么就是中间两个数字的平均数
                return (findKth(A,m,B,n,total/2) + findKth(A,m,B,n,total/2+1) )/2;
        }
    };
    
    int main()
    {
        int A[] = {1,4,6,7,9};
        int B[] = {3,5,6,8};
        Solution *myS = new Solution();
        double ans = myS->findMedianSortedArrays(A,5,B,4);
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    java实现同步的两种方式
    JAVA线程概念
    XML基础总结
    JAVA使用和操作properties文件
    JAVA序列化基础知识
    easyui 在编辑状态下,动态修改其他列值。
    Activiti初学问题,求解
    java web--DOM
    java web(1)
    Java WEB
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3516552.html
Copyright © 2011-2022 走看看