java代码
package leetcode.editor.cn;
import java.security.spec.RSAOtherPrimeInfo;
/**
* 寻找两个正序数组的中位数
*
* @author Cao Ziqiang
* @date 2022-09-02 15:03:14
*/
public class P4_MedianOfTwoSortedArrays {
public static void main(String[] args) {
//测试代码
Solution solution = new P4_MedianOfTwoSortedArrays().new Solution();
int[] nums1 = {1,2,3};
int[] nums2 = {4,5,6};
System.out.println(solution.findMedianSortedArrays(nums1, nums2));
}
//代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//初始化数组
int len1 = nums1.length;
int len2 = nums2.length;
int len = len1 + len2;//定义新数组的长度
int[] nums = new int[len];
//分情况判断
// 1 两个数组长度都为0
if (len1 == 0 && len2 == 0) {
return 0; //因为是double 所以是0.0,一会验证一下0是否可以,0也可以
}
//2 有一个数组为空
// 2.1如果第一个数组为0,则直接返回第二个数组的中位数
if(len1 ==0){
if(len2 %2 ==0){
return (nums2[len2/2 -1 ] + nums2[len2 /2 ])/2.0;//要用2.0,否则会舍弃小数,只有整数
}else{
return nums2[len2/2];
}
}
//2.2 如果第二个数组为空,取第一个数组的中位数
if(len2 ==0){
if(len1 %2 ==0){
return (nums1[len1/2-1 ] + nums1[len1 /2 ])/2.0; //要用2.0,否则会舍弃小数,只有整数
}else{
return nums1[len1/2];
}
}
//情况3 两个数组都不为空,将两个数组按从小到大的顺序放到新数组中
//定义一个count变量用于统计放入新数组的元素的个数
int count=0;
// 索引i1,i2分别指向两个有序数组的起始索引
int i1=0;
int i2=0;
//只要count 没有到达 新数组的长度len就一直循环
while(count != len){
//判断nums1和nums2数组哪个小,放入小的元素,并将放入的数组的索引自增,新数组的索引自增
if(nums1[i1] < nums2[i2]){
nums[count] = nums1[i1];
count = count+1;
i1 = i1+1;
}else{
nums[count] = nums2[i2];
count = count+1;
i2 = i2+1;
}
//如果第一个数据的元素已经放完,则一下子把第二个数组的元素放完
if(i1 ==len1){
while(i2 != len2){
nums[count] = nums2[i2];
count = count+1;
i2 = i2+1;
}
}
//同理,如果第二个数组的元素放完,一下子把第一个数组的元素放完
if(i2 ==len2){
while(i1 != len1){
nums[count] = nums1[i1];
count = count+1;
i1 = i1+1;
}
}
}
//最后,输出最终数组的中位数,也是分奇数和偶数两种情况判断
if(len % 2 ==0){
return (nums[len/2-1] + nums[len/2 ])/2.0;
}else{
return nums[len/2];
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}