博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 4. Median of Two Sorted Arrays
阅读量:6354 次
发布时间:2019-06-22

本文共 2974 字,大约阅读时间需要 9 分钟。

4. Median of Two Sorted Arrays 

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

Mean: 

给定两个数组,求这两个数组的中位数.(要求时间复杂度为O(log(n+m))

analyse:

一开始用归并为一个数组的方法做了一下也AC了,看来lc的时间还是给的很宽的.

将本题转化为求第k大数就简单多了,其中求第k大数使用类似二分的方法来实现,从而将时间复杂度降到O(log(n+m)).

Time complexity: O(log(n+m)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-02-03-12.07
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
/*Solution 1*/
class
Solution
{
   
//求A和B数组的第k大数
   
int
getMedian(
int
A
[],
int
m
,
int B
[],
int n
,
int
k)
   
{
       
if(
m
>n)
           
return
getMedian(B
,n
,
A
,
m
,
k);
//默认A为短数组
       
if(
m
==
0)
           
return B
[
k
-
1
];
       
if(
k
==
1)
           
return
min(
A
[
0
], B
[
0
]);
       
int
pa
=
min(
k
/
2
,
m);
       
int pb
=
k
-
pa;
       
if(
A
[
pa
-
1
]
< B
[pb
-
1
])
       
{
           
return
getMedian(
A
+
pa
,
m
-
pa
, B
, n
,
k
-
pa);
       
}
       
else
if(
A
[
pa
-
1
]
> B
[pb
-
1
])
       
{
           
return
getMedian(
A
,
m
, B
+pb
, n
-pb
,
k
-pb);
       
}
       
else
       
{
           
return
A
[
pa
-
1
];
       
}
       
return
0;
   
}
public
:
   
double
work(
int
A
[],
int
m
,
int B
[],
int n)
   
{
       
if((
m
+n)
%
2
==
0)
       
{
           
return (
getMedian(
A
,
m
,B
, n
, (
m
+n)
/
2)
+
getMedian(
A
,
m
,B
, n
, (
m
+n)
/
2
+
1))
/
2.;
       
}
       
else
       
{
           
return
getMedian(
A
,
m
,B
, n
, (
m
+n)
/
2
+
1);
       
}
   
}
   
double
findMedianSortedArrays(
vector
<
int
>&
nums1
,
vector
<
int
>&
nums2)
   
{
       
int
A
[
10000
],B
[
10000
];
       
int
idx
=
0;
       
for(
auto
p:
nums1)
       
{
           
A
[
idx
++
]
=p;
       
}
       
idx
=
0;
       
for(
auto
p:
nums2)
       
{
           B
[
idx
++
]
=p;
       
}
       
int
m
=
nums1
.
size();
       
int n
=
nums2
.
size();
       
double
ret
=
work(
A
,
m
,B
,n);
       
return
ret;
   
}
};
/*Solution 2*/
/*
class Solution
{
public:
   double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
   {
       auto it1=nums1.begin();
       auto it2=nums2.begin();
       vector<int> a;
       while(it1!=nums1.end() || it2!=nums2.end())
       {
           if(it1==nums1.end() && it2!=nums2.end())
           {
               a.push_back((*it2));
               it2++;
           }
           else if(it1!=nums1.end() && it2==nums2.end())
           {
               a.push_back(*it1);
               it1++;
           }
           else if(it1!=nums1.end() && it2!=nums2.end())
           {
               if((*it1)<(*it2))
               {
                   a.push_back(*it1);
                   it1++;
               }
               else
               {
                   a.push_back(*it2);
                   it2++;
               }
           }
       }
       int len=a.size();
       double ans=(len%2)?(double)a[len/2]:(double)(a[len/2-1]+a[len/2])/2.;
       return ans;
   }
};
*/
int
main()
{
     
int n
,
m
,
temp;
     
while(
cin
>>n
>>
m)
     
{
         
vector
<
int
>
a
,b;
         
for(
int
i
=
0;
i
<n;
++
i)
         
{
             
cin
>>
temp;
             
a
.
push_back(
temp);
         
}
         
for(
int
i
=
0;
i
<
m;
++
i)
         
{
             
cin
>>
temp;
             b
.
push_back(
temp);
         
}
         
Solution
solution;
         
double
ans
=
solution
.
findMedianSortedArrays(
a
,b);
         
cout
<<
"===========ans==========="
<<
endl;
         
cout
<<
ans
<<
endl;
     
}
     
return
0;
}

 

转载于:https://www.cnblogs.com/crazyacking/p/5035606.html

你可能感兴趣的文章
ADO.NET数据访问技术
查看>>
SourceMonitor的安装及使用
查看>>
AE Scene开发中的观察者模式
查看>>
bzoj 1098 poi2007 办公楼 bfs+链表
查看>>
linux面试题集锦2《转》
查看>>
Asp.net core 学习笔记 ( Data protection )
查看>>
在C#代码中应用Log4Net(三)Log4Net中配置文件的解释
查看>>
Java(第三章)
查看>>
通过QQ邮箱的SMTP服务器发送QQ邮件至163邮箱提示“发送邮件失败”的解决方案(三种可能性,不妨一试)...
查看>>
微信小程序 app注册小程序+page注册页面代码一
查看>>
javascript前端面试题及答案整理
查看>>
java计算两个日期之间的天数,排除节假日和周末
查看>>
Extjs 教程六 “ grid篇(2)”
查看>>
2011仍是云计算政策主导年
查看>>
实拍:丽江特色美食腊排骨火锅
查看>>
微信支付(未完)
查看>>
C/C++中动态链接库的创建和调用
查看>>
Spring源码下载
查看>>
liunx 配置 php curl 拓展库的方法
查看>>
NOIP2017 d1t2 时间复杂度
查看>>