您的位置:首页 > 其它

leetcode 寻找两个有序数组的中位数 median of two sorted arrays

2019-01-13 03:34 736 查看

这个题用python写真的非常短 当然这是一种比较无脑的方法 后面有认真思考的版本
在这个版本里非常简单把两个list合并再排序排序用a.sort()
奇数长度取数组长度整除2的位置 偶数取两位/2
里面的易错点:
int/int =int (达到整除效果)
float/float=float 被除数除数有一个为float即可 这个地方很关键 一开始测试没过就是因为2+3/2 应该是2.5 却出来了2
python 版本

class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
new=nums1+nums2
new.sort()
long=len(new)

if long%2==0 :
return float((new[long/2]+new[long/2-1]))/2
else:
return new[long/2]

c++ 版本
得到元素类型的方法
法一:
typeid(元素名).name()
法二:
const type_info& t1=typeid(元素名);
const char *a=t1.name;

c++数组没有append 不是python
string有append

class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int count=0 , flag1=0, flag2=0;
int len1= nums1.size();
int len2=nums2.size();
int len=len1+len2;
int medium=len/2 +1 ;
int array[medium];
while (count != medium  & len1!=0  & len2!=0 ) {
if (nums1[flag1]<=nums2[flag2]) {
array[count]=nums1[flag1];
count+=1;
flag1+=1;
if (flag1==len1) {
int xz=medium-count;
for (int num_need=0; num_need<xz;num_need++){
array[count]=(nums2[flag2+num_need]);
count+=1;
}
break;
}
}
else{
array[count]=nums2[flag2];
count+=1 ;
flag2+=1;
if( flag2==len2){
int xz2=medium -count;
for (int num_need=0; num_need<xz2;num_need++){
array[count] = nums1[flag1+num_need];
count+=1;
}
break;}

}
}
if (len==1){
if (len1==0){
return nums2[0];}
else{
return nums1[0];

}

}
else{
if (len1==0){
array[medium-2]=nums2[medium-2];
array[medium-1]=nums2[medium-1];
}
if (len2==0){
array[medium-2]=nums1[medium-2];
array[medium-1]=nums1[medium-1];
}
}

if (len%2==0){
return float((array[medium-2]+array[medium-1]))/2;}
else{
return array[medium-1];
}

}
};

归并算法并不能达到要求的时间复杂度
标答的方法是 把两个数组都切成两半 然后比较两个数组的中位数 大的那个中位数的后面的数必然不在总数组的前一半
把被割掉后半部分的数组的前半部分再取中位数 再比较 不断重复
写不动了就不写了
再见了 老铁们 明天见

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐