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] 会被踢出

  • 相关阅读:
    大话算法-排序-希尔排序
    Linux三剑客-awk
    Linux三剑客-sed
    大话算法-排序-冒泡排序
    大话算法-排序-选择排序
    删除Win10菜单中的幽灵菜单(ms-resource:AppName/Text )
    微信推送模板消息
    获取当前域名的根域
    MVC 全站开启缓存,缓解服务器的请求压力
    MVC 开启gzip压缩
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3674096.html
Copyright © 2011-2022 走看看