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

本文共 2919 字,大约阅读时间需要 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;
}

 

转载地址:http://bmkpa.baihongyu.com/

你可能感兴趣的文章
Flask之旅: 快速上手
查看>>
Android图片加载开源库深度推荐,安利Fresco
查看>>
聊聊flink的MemoryPool
查看>>
聊聊flink KeyedStream的KeySelector
查看>>
spring mvc如何计算BEST_MATCHING_PATTERN_ATTRIBUTE
查看>>
swift 消息监听和键值监听(kvo)
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
Spring定时任务高级使用篇
查看>>
阿里资深技术专家总结:要怎样努力才可以成为公司主力架构师
查看>>
数学推导+Python实现机器学习算法:线性回归
查看>>
Android AccessibilityService机制源码解析
查看>>
Android基础知识
查看>>
寻找数组主元素(Majority Element))
查看>>
如何将ST05生成的trace导入HANA Studio里并以图形化方式显示出来
查看>>
TiDB 在西山居实时舆情监控系统中的应用
查看>>
说一说 JVM 对锁的优化
查看>>
图像处理库GPUImage简单使用
查看>>
基于Java语言构建区块链(五)—— 地址(钱包)
查看>>
Elastic Search 安装和配置
查看>>
手动实现 express
查看>>