leetcode 004 Median of Two Sorted Arrays

本文介绍了一种高效算法来找到两个已排序数组的中位数。该算法首先检查数组长度,对于空数组的情况给出特定处理。接着,通过合并两个数组并排序,最后根据合并数组的长度确定返回单个中位数还是两个中位数的平均值。

这道题和第2题结构上类似,我说的结构类似不是算法类似。

大概意思是,同样都是有三种情况:

第一种:两个Array的长度length是否都为0,如果都为0,则返回0.0

第二种:如果有一个为0,则返回另一个Array的中间值

第三种:如果都不为0,这个是一般情况,则在创建一个数组把两个数组都放进去,重新排序,再返回中间值。

其中,第三种的重新排序有一个简单的算法,并不需要用冒泡,快排之类的排序

Arrays.sort(nums3);/*其中nums3是新创建的新数组,包含nums1和nums2的所有值*/
继续。

取中间值这个就很简单了。判断是否为奇数或偶数,然后在分别取中间值,奇数就直接取中间值(一个),偶数是两个,加和除以2即可。

注意一定要加上double的强制转换,我踩了这个坑!!!!!!

注意一定要加上double的强制转换,我踩了这个坑!!!!!!

注意一定要加上double的强制转换,我踩了这个坑!!!!!!

说三遍!!!!!!!!

if( nums2.length % 2 == 0)
	ave2 = ((double)nums2[(nums2.length-1)/2]+(double)nums2[(nums2.length+1)/2])/2;      
else
	ave2 = nums2[nums2.length/2];
剩下的就没有什么难度了。

下面贴代码。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
          double ave1 = 0.0, ave2 = 0.0;
	        if( nums1.length == 0 && nums2.length == 0)
	            return 0.0;
	        else if( nums1.length == 0){
	            if( nums2.length % 2 == 0)
	            	ave2 = ((double)nums2[(nums2.length-1)/2]+(double)nums2[(nums2.length+1)/2])/2;      
	            else
	                ave2 = nums2[nums2.length/2];
	            return ave2;
	        }
	        else if( nums2.length == 0){
	            if( nums1.length % 2 == 0)
	                ave1 = ((double)nums1[(nums1.length-1)/2]+(double)nums1[(nums1.length+1)/2])/2;
	            else
	                ave1 = nums1[nums1.length/2];
	            return ave1;
	        }else{
	        	int nums3[] = new int [nums2.length+nums1.length]; 
	        	for( int i = 0; i < nums1.length; i++)
	        		nums3[i] = nums1[i];
	        	for( int i = nums1.length; i < nums3.length; i++)
	        		nums3[i] = nums2[i-nums1.length];
	        	Arrays.sort(nums3);
	        	if( nums3.length % 2 == 0)
	        		ave1 = ((double)nums3[(nums3.length-1)/2]+(double)nums3[(nums3.length+1)/2])/2;
	            else
	                ave1 = nums3[nums3.length/2];
	            return ave1;
	        }
    }
}

我真的要吐槽这个代码排版。

好气哦,改了好几次。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值