算法训练——寻找两个正序数组的中位数

分享一道力扣题目:寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:
输入:nums1 = [], nums2 = [1]
输出:1.00000

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

show the code as follow:

package leetcode;

import org.junit.Test;
/**
 * 寻找两个正序数组的中位数
 * @author jsyuger
 *
 */
public class Solution4 {
	
	@Test
	public void test(){
		int num1[] = {1,3,6};
		int num2[] = {4,5,8};
		System.out.print(findMedianSortedArrays(num1,num2));
	}
	
	/**
	 * 寻找两个正序数组的中位数实现方法
	 * @param nums1
	 * @param nums2
	 * @return
	 */
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    	double result = -1;
    	//两个数组的长度之和
    	int reNumsLength = nums1.length + nums2.length ;
    	
    	//都是空数组返回-1
    	if(reNumsLength==0) return result;
    	
    	//有一个为空数组的情况
    	if(nums1.length==0){
    		return result = ((nums2.length-1)%2==0)?nums2[reNumsLength/2]:(nums2[reNumsLength/2]+nums2[reNumsLength/2-1])/2.00000 ;
    	}
    	if(nums2.length==0){
    		return result = ((nums1.length-1)%2==0)?nums1[reNumsLength/2]:(nums1[reNumsLength/2]+nums1[reNumsLength/2-1])/2.00000 ;
    	}
    	
    	//合并数组re
    	int re[] = new int[reNumsLength];
    	int k = 0 ;
    	
    	//构造新数组
    	int i = 0 ,j = 0; //指针i用来遍历nums1,指针j用来遍历nums2
    	while(i<=nums1.length-1 && j<=nums2.length-1){
    		if(nums1[i]<nums2[j]) {    			
    			if(i<nums1.length-1) {re[k]=nums1[i]; i++; k++;}
    			//到达nums1的最后一个元素
    			else{
    				re[k]=nums1[i]; 
    				k++;
    				for(int x=j;x<=nums2.length-1;x++){ //后续的不需比较,直接用nums2剩余的元素填充re数组
    					re[k]=nums2[x];
    					k++;
    				}
    				break;
    			}
    		}
    		
    		else{
    			if(j<nums2.length-1) {re[k]=nums2[j]; j++; k++;}
    			//到达nums2的最后一个元素
    			else{
    				re[k]=nums2[j]; 
    				k++;
    				for(int y=i;y<=nums1.length-1;y++){ //后续的不需比较,直接用nums1剩余的元素填充re数组
    					re[k]=nums1[y];
    					k++;
    				}
    				break;
    			}	
    		}
    			
    	}
    	
    	//返回结果
    	return result = ((k-1)%2==0)?re[(k-1)/2]:(re[(k-1)/2]+re[(k-1)/2+1])/2.00000 ;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值