zoukankan      html  css  js  c++  java
  • leetcode: Median of Two Sorted Arrays

    http://oj.leetcode.com/problems/median-of-two-sorted-arrays/

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    思路: 

    对一维数组的二分查找进行扩展(findKthNumber函数的实现)。先分别定位在A,B的中点。现在分两种情况:(mid = middle)

    1. A,B前半段数字的个数(包含中点)大于k:
      • A[mid]大于B[mid],新的搜索范围为B的全部和A的前半段(不包括mid)。
      • B[mid]大于等于A[mid],新的搜索范围为A的全部和B的前半段(不包括mid)。
    2. A,B前半段数字的个数(包含中点)小于等于k:
      • A[mid]大于B[mid],新的搜索范围为A的全部和B的后半段(不包括mid),并且k更新为k - (b_mid - b_start + 1)。因为B的前半段可以舍弃,第k个数必然出现在新的搜索范围内,并且因为B的前半段被舍弃,k的值也需要做相应调整。
      • B[mid]大于等于A[mid],新的索索范围为B的全部和A的后半段(不包括mid),并且k更新为k - (a_mid - a_start + 1)。原理同上。

    基于以上分析,我们就很容易写出一个基于递归的实现。

     1 class Solution {
     2 public:
     3     int findKthNumber(int A[], 
     4             int a_start,
     5             int a_end,
     6             int B[],
     7             int b_start,
     8             int b_end,
     9             int k) {
    10         if (a_start > a_end) {
    11             return B[b_start + k - 1];
    12         }
    13         
    14         if (b_start > b_end) {
    15             return A[a_start + k - 1];
    16         }
    17         
    18         int a_mid = (a_start + a_end) / 2, b_mid = (b_start + b_end) / 2;
    19         int a_len = a_mid - a_start + 1;
    20         int b_len = b_mid - b_start + 1;
    21         int len = a_len + b_len;
    22         
    23         if (len > k) {
    24             if (A[a_mid] > B[b_mid]) {
    25                 return findKthNumber(A, a_start, a_mid - 1, B, b_start, b_end, k);
    26             }
    27             else {
    28                 return findKthNumber(A, a_start, a_end, B, b_start, b_mid - 1, k);
    29             }
    30         }
    31         else {
    32             if (A[a_mid] > B[b_mid]) {
    33                 return findKthNumber(A, a_start, a_end, B, b_mid + 1, b_end, k - b_len);
    34             }
    35             else {
    36                 return findKthNumber(A, a_mid + 1, a_end, B, b_start, b_end, k - a_len);
    37             }
    38         }
    39     }
    40     
    41     double findMedianSortedArrays(int A[], int m, int B[], int n) {
    42         bool even =  (0 == ((m + n) % 2));
    43         int mid = even ? (m + n) / 2 : (m + n) / 2 + 1;
    44         int v_1 = findKthNumber(A, 0, m - 1, B, 0, n - 1, mid);
    45         
    46         if (!even) {
    47             return v_1;
    48         }
    49         else {
    50             int v_2 = findKthNumber(A, 0, m - 1, B, 0, n - 1, mid + 1);
    51             return (double)(v_1 + v_2) / 2.0f;
    52         }
    53     }
    54 };
  • 相关阅读:
    Oracle启动关闭
    Open_stack 有虚拟机端口不通的问题
    关于Oracle归档的一些操作
    电脑无法开机 接通电源后主板有红灯闪烁的问题
    Centos7+python3.6+face-recognition
    电脑无法开机的问题-主板上有红色告警灯闪烁
    关于systemctl
    Vsftp搭建 for centos7
    外星人入侵——安装Pygame
    mysql索引原理详解
  • 原文地址:https://www.cnblogs.com/panda_lin/p/median_of_two_sorted_arrays.html
Copyright © 2011-2022 走看看