zoukankan      html  css  js  c++  java
  • leetcode-【hard】4. 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)).

    Example 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    The median is 2.0
    

    Example 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    The median is (2 + 3)/2 = 2.5

    答案

    看到题目要求O(log (m+n)),知道应该用二分,但是没有想到具体实施的办法,在网上搜了答案,看懂了完成的代码,这道题刷新了我对二分的看法,神一样的存在。

    代码

     1 #define MIN(a,b) ((a) > (b) ? (b) : (a))
     2 
     3 
     4 class Solution {
     5 public:
     6     int findMedNum(vector<int>::iterator nums1Beg,int nums1Num,vector<int>::iterator nums2Beg,int nums2Num,int med)
     7     {
     8         if(nums1Num == 0 )
     9         {
    10             return *(nums2Beg + med - 1);
    11         }
    12         if(nums1Num > nums2Num)
    13         {
    14             return findMedNum(nums2Beg,nums2Num,nums1Beg,nums1Num,med);
    15         }
    16         
    17         if(med == 1)
    18         {
    19             return MIN(*nums1Beg,*nums2Beg);
    20         }
    21         
    22         int nums1BegMed = MIN(med / 2, nums1Num);
    23         int nums2BegMed = med - nums1BegMed;
    24         
    25         if(*(nums1Beg + nums1BegMed - 1) == *(nums2Beg + nums2BegMed - 1))
    26         {
    27             return *(nums1Beg + nums1BegMed - 1);
    28         }
    29         
    30         if(*(nums1Beg + nums1BegMed - 1) < *(nums2Beg + nums2BegMed - 1))
    31         {
    32             return findMedNum(nums1Beg + nums1BegMed,nums1Num - nums1BegMed,nums2Beg,nums2BegMed,med - nums1BegMed);
    33         }
    34         
    35         if(*(nums1Beg + nums1BegMed - 1) > *(nums2Beg + nums2BegMed - 1))
    36         {
    37             return findMedNum(nums1Beg,nums1BegMed,nums2Beg + nums2BegMed,nums2Num - nums2BegMed,med - nums2BegMed);
    38         }
    39         
    40         return 0;
    41     }
    42     
    43     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    44         if(nums1.size() == 0 && nums2.size() == 0)
    45         {
    46             return 0;
    47         }
    48         int totalLen = nums1.size() + nums2.size();
    49         
    50         if(totalLen & 0x1)
    51         {
    52             return findMedNum(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),(totalLen / 2) + 1);
    53         }
    54         else
    55         {
    56             int pre = findMedNum(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),totalLen / 2);
    57             int post = findMedNum(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),(totalLen / 2) + 1);
    58             return (double)(pre + post) / 2.0;
    59         }
    60         
    61         return 0;
    62     }
    63 };
    View Code
  • 相关阅读:
    HTTP/2之服务器推送(Server Push)最佳实践
    相似人群画像算法
    Linux也有后悔药,五种方案快速恢复你的系统
    IPv6原理、应用与实践
    护航者,腾讯云: 2017年度游戏行业DDoS态势报告—回溯与前瞻
    放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?
    Unity引擎与C#脚本简介
    腾讯云Redis混合存储版重磅推出,万字长文助你破解缓存难题!
    拒绝平庸,以程序员的名义定义新桌面!
    腾讯云EMR大数据实时OLAP分析案例解析
  • 原文地址:https://www.cnblogs.com/Shirlies/p/5756858.html
Copyright © 2011-2022 走看看