zoukankan      html  css  js  c++  java
  • 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] 会被踢出

  • 相关阅读:
    codevs 2149 矩形周长
    codevs 3044 矩形面积求并
    codevs 1293 送给圣诞夜的极光
    codevs 2806 红与黑
    codevs 1536 海战
    codevs 1262 不要把球传我
    codevs 2606 约数和问题
    BZOJ 2301 problem b
    BZOJ 3994 约数个数和
    codevs 1173 最优贸易
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3674096.html
Copyright © 2011-2022 走看看