【Lintcode】Median of two Sorted Arrays

class Solution {
public:
    /**
     * @param A: An integer array.
     * @param B: An integer array.
     * @return: a double whose format is *.5 or *.0
     */
     
    
    int check(vector<int>& A, vector<int>& B,int k,int m)
    {
        int M = A.size();
        int N = B.size();
        int y = A[m];
        if (m > k) return -1;
        if (m == k)
        {
            if (!N || B[0] >= y) return 0;
            return -1;
        }
        int index = k - m - 1;
        if (index >= N) return 1;
        int x = B[index];
        if (x > y) return 1;
        if (x == y) return 0;
        // x < y
        if (index == N - 1) return 0;
        int z = B[index + 1];
        if (z < y) return -1;
        return 0;
    }
    
    int find(vector<int>& A, vector<int>& B,int k)
    {
        int l = 0;
        int r = A.size()-1;
        while (l <= r)
        {
            int m = (l + r)/2;
            auto f = check(A,B,k,m);
            if (f == 0) return A[m];
            if (f < 0) r = m - 1;
            else l = m + 1;
        }
        if (l == r) return A[l];
        else return find(B,A,k); 
    }
     
    double findMedianSortedArrays(vector<int> A, vector<int> B) {
        // write your code here
        int M = A.size();
        int N = B.size();
        if ((M + N) & 1) return find(A,B,(M+N)/2);
        return 0.5*(find(A,B,(M+N)/2) + find(A,B,(M+N)/2-1));
    }
};

这道题写了我一个小时,一开始瞎写的,后来换成了现在看到的这个框架。

也是我写的各种错以后痛定思痛,决定整数二分就用这个框架。

这个框架的好处就是,让整数的二分真正成为了一个模板,不至于把二分的模板和中间点是大了还是小了的程序混在一起,造成检查上的不便。

不吹不黑,这么写以后整数二分写起来的成功率和速度都是非常令人满意的,以后有整数二分的题目绝对是有一道秒一道。

从局部来说这一个小时花的很值得,让我应对整数二分有了好的办法,从整体上来说,这一个小时也很值得。

我发现了慢慢磨一道题磨出来和快速优美的把一道题目写出来是两种境界,刷简单题的话,不能用磨的。

Lintcode的好处就是,旁边有计时器,这两天我也是各种改掉之前刷leetcode磨磨蹭蹭的坏习惯。

总之就是,简单题不能一看到题目就啪啪啪拍程序的,就是有东西没学会或者没有领悟。

----------------------------

其实这一个小时里后面小半个小时是卡在了一个脑残错误上,check我返回了bool,没有发现。

不过这次数组越界的问题考虑的还蛮好的,一次就对了。

再刷一下吧,这几天。

posted @ 2016-02-20 14:47  syb3181  阅读(153)  评论(0编辑  收藏  举报