Leetcode:寻找两个正序数组的中位数

题目:
给定两个排序数组,求其中位数。要求时间复杂度O(log(m+n))。
解析:
记数组1大小m,数组2大小n,那么中位数为合并后的排序数组的最中间两个数字nums[mid1] nums[mid2]的平均值,或者最中间的那个数字nums[mid1]。使用两个指针i,j遍历每个数组,判断其数字nums1[i]和nums2[j]大小,小的作为合并后数组的当前值,用一个变量index记录合并后数组的索引。若一个数组遍历完,则遍历剩余的数组,否则比较当前值,当index=mid1和mid2时,记录两个值。暂时实现时间复杂度O(m+n)的一趟扫描算法。O(log(m+n))留待日后解决。
参考答案

class Solution {
public:    
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
{        
int len=nums1.size()+nums2.size();  //总个数                
int index=len/2;                    //中间位置        
int i=0,j=0;                        //遍历下标        
int num=0;                        //记录当前下标数值        
float temp1=0,temp2=0;              //记录中位数的值,奇数时只有temp2;偶数个数时(temp2+temp1)*0.5        
if(nums1.size()==0)                 //nums1数组元素个数为0时       
{
if(nums2.size()%2==0)            
{                
return (nums2[nums2.size()/2]+nums2[(nums2.size()/2)-1])*0.5;           //乘以0.5或是1.0将int转换成float            
}            
else             
{                
return nums2[nums2.size()/2]*1.0;            
}        
}             
if(nums2.size()==0)               //nums2数组元素个数为0时        
{            
if(nums1.size()%2==0)            
{                
return (nums1[nums1.size()/2]+nums1[(nums1.size()/2)-1])*0.5;            
}            
else             
{                
return nums1[nums1.size()/2]*1.0;            
}        
}
while(num<=index)        
{              
if(i>=nums1.size() && j<nums2.size())           //nums1元素遍历完            
{                 
if(num==(index-1))
{                        
temp1=nums2[j];                        
}                   
if(num==index)
{                        
temp2=nums2[j];                        
}                    
j++;            
}            
else if(i<nums1.size() && j>=nums2.size())      //nums2元素遍历完            
{                
if(num==(index-1))
{                        
temp1=nums1[i];                        
}                   
if(num==index)
{                        
temp2=nums1[i];                        
}                    
i++;            
}                
else if(nums1[i]>=nums2[j])                
{                    
if(num==(index-1))
{                        
temp1=nums2[j];                        
}                   
if(num==index)
{                        
temp2=nums2[j];                        
}                    
j++;                
}               
else                 
{                    
if(num==(index-1))
{                        
temp1=nums1[i];                        
}                   
if(num==index)
{                        
temp2=nums1[i];                        
}                    
i++;                
}                
num++;                     
}
return (len%2==0)?((temp1+temp2)/2)*1.0:temp2*1.0;;    
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值