分享一道力扣题目:寻找两个正序数组的中位数
给定两个大小分别为 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 ;
}
}