Leetcode: Median of two sorted Array

将题目转化为 "Kth element in 2 sorted array" 的问题

 

if(m/2 + n/2) > k && a[m/2] > b[n/2] drop section 2

if(m/2 + n/2) > k && a[m/2] < b[n/2] drop section 4

if(m/2 + n/2) < k && a[m/2] > b[n/2] drop section 3

if(m/2 + n/2) < k && a[m/2] < b[n/2] drop section 1

代码:

class Solution {

public:

double findMedianSortedArrays(int A[], int m, int B[], int n) {

    if((m+n) & 1) { // m+n is odd

        return getKth(A, m, B, n, (m+n)/2+1);

    } else {

        return 1.0/2*(getKth(A, m, B, n, (m+n)/2)+ getKth(A, m, B, n, (m+n)/2 + 1) );

    }

}

int getKth(int A[], int m, int B[], int n, int k) {

    if(m <= 0) return B[k-1];

    if(n <= 0) return A[k-1];

    if(k <= 1) return min(A[0], B[0]);

    if(A[m/2] > B[n/2]) {

        if(m/2 + n/2 + 1 >= k) {

            getKth(A, m/2, B, n, k);

        } else {

            getKth(A, m, B+n/2+1, n-(n/2+1), k-(n/2+1));

        }

    } else {

        if(m/2 + n/2 + 1 >= k) {

            getKth(A, m, B, n/2, k);

        } else {

            getKth(A+m/2+1, m-(m/2+1), B, n, k-(m/2+1));

        }

    }

}

};         

总结

1. 第一次真正使用 A[], m 这种描述数组的方法. 的确, 这种方法比 int st, ed 要好, 毕竟少了个参数

2. 第一个判断条件是 a[m/2] > b[n/2]), 第二个判断条件是 (m/2 + n/2 +1). 第二个判断条件比较直观的是 m/2+n/2+2, +1 的话能够更快的收敛, 因为这保证每次至少有 a[m/2] or b[n/2] 会被踢出

原文地址:https://www.cnblogs.com/zhouzhuo/p/3674096.html