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

  • 相关阅读:
    Vue.js依赖收集
    Vue.js响应式原理
    详解.Net 如何上传自己的包到Nuget平台以及如何使用Nuget包管理器
    利用docker容器运行.net core webapi
    wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!
    算法之A星算法(寻路)
    Python 学习日记 第一天
    Python 学习日记 第三天
    Python 学习日记 第二天
    再做一题,2013616更新
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3674096.html
Copyright © 2011-2022 走看看