zoukankan      html  css  js  c++  java
  • 一起刷LeetCode4-Median of Two Sorted Arrays

      实验室太吵了。。。怎么办啊。。。

    --------------------------------------------------------------------------------------------------------------------

    Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 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)).

    【题意】:给你两个已经排好序的数组,求中位数,要求时间复杂度为:O(log(m+n))。

    【心路历程】:看完这道题直接的想法就是用merge 的方法对两个数组合并排序,但是时间复杂度为:O((m+n))。

    因为要求的时间复杂度为O(log(m+n)),所以很自然会想去用二分求解。于是,我最开始的思路是分别对两个数组进行二分,

    然后进行比较,如果A > B,则去掉B的小于N/2的部分,去掉A的大于M/2的部分。如果A < B,则去掉A的小于M/2的部分,

    去掉B的大于M/2的部分。如果 A = B ,则返回中间值。后来发现这个方法有很多不妥之处,自己实现时也是感觉有问题。

    于是又开始想,发现自己确实没啥思路,就无耻的度娘了一下,发现这题可以转化成求最K值问题。原来在《剑指OFFER》上看过

    最k值问题,但是却忘得一干二净了。。。

    这题就是最K值问题,两个数组分别取第K/2个元素进行比较。如果A[K/2] < B[K/2] ,则忽略掉A[k/2]之前的所有元素;同理如果

    A[K/2] > B[K/2] ,则忽略掉B[K/2]之前的所有元素;如果A[K/2] == B[K/2] ,则返回A[K/2] 或 B[K/2] 任意的一个元素

    (其实这个想法,和我之前想到的那个还是蛮相似的。。。)。用递归很好实现,代码是学习别人的,感觉写的很好,比自己的写的好。

    学习了,感觉自己代码实现能力还是不太好,要加强。

    -----------------------------------------------------------------------------------------------------------------------------------

    代码如下:

     1 double f(int * nums1,int m,int *nums2,int n,int k) {
     2     if(m > n) {
     3         return f(nums2,n,nums1,m,k);
     4     }
     5     if(m == 0) {
     6         return nums2[k - 1];
     7     }
     8     if(k == 1) {
     9         if(nums1[0] < nums2[0]) {
    10             return nums1[0];
    11         }else {
    12             return nums2[0];
    13         }
    14     }
    15     int pa,pb;
    16     if(k/2 < m) {
    17         pa = k/2;
    18         pb = k - pa;
    19     }else {
    20         pa = m;
    21         pb = k -pa;
    22     }
    23     if(nums1[pa - 1] < nums2[pb - 1]) {
    24         return f(nums1 + pa,m - pa,nums2 , n, k - pa);
    25     }else if(nums1[pa - 1] > nums2[pb - 1]) {
    26         return f(nums1 ,m ,nums2 + pb, n - pb, k - pb);
    27     }else {
    28         return nums1[pa - 1];
    29     }
    30 }
    31 
    32 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    33    
    34     int total = nums1Size + nums2Size;
    35     if(total % 2 == 0){
    36         return ( f(nums1,nums1Size,nums2,nums2Size,total/2) + f(nums1,nums1Size,nums2,nums2Size,total/2 + 1) ) / 2; 
    37     }else {
    38         return f(nums1,nums1Size,nums2,nums2Size,total/2 + 1);
    39     }
    40 }
  • 相关阅读:
    Poj1163 The Triangle(动态规划求最大权值的路径)
    Poj1258_Agri-Net(最小生成树)
    Poj1258_Agri-Net(最小生成树)
    Poj1218_THE DRUNK JAILER(水题)
    Poj1218_THE DRUNK JAILER(水题)
    Poj1298_The Hardest Problem Ever(水题)
    Poj1298_The Hardest Problem Ever(水题)
    Poj1012_Joseph
    Poj1012_Joseph
    Poj_1008--Maya Calendar
  • 原文地址:https://www.cnblogs.com/LeeZz/p/4495976.html
Copyright © 2011-2022 走看看