LeetCode(4)(困难)寻找两个正序数组的中位数

一、题目

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

算法的时间复杂度应该为 O(log (m+n)) 。

示例 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

提示:

nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

在这里插入图片描述

二、解题思路

1、我们需要对两个数组进行合并 可以使用List集合或者重新开拓一个数组**(数组的长度为两个数组长度之和)
2、排序,这里可以用的方法很多,如果上面使用的是List集合,这里我们可以使用Collections.sort(待排序的集合名);对集合进行排序。 如果使用的是数组我们可以使用Arrays.sort(待排序数组名);
3、找出中位数,定义一个
double类型**的变量用来接受。这时候我们需要判断数组或者是容器的长度为奇数还是偶数,如果是奇数,则直接/2找到中间的数即可。如果是偶数则需要,找出中间的两个数(数组长度/2找出第一个,先将数组长度 - 1然后再 / 2找出第二个),将两个数进行 / 2 后将其输出。

三、代码如下

package LeetCood;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
 */
public class 寻找两个正序数组的中位数 {
    public static void main(String[] args) {
        int[] nums1 = new int[]{1, 2};
        int[] nums2 = new int[]{3, 4};
        Solution solution = new Solution();
        System.out.println(solution.findMedianSortedArrays(nums1, nums2));
    }
}

/**
 * 先合并两个数组  排序  然后找出中位数  这里要判断数组长度是奇数还是很偶数
 */
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] newNums = new int[nums1.length + nums2.length];
        for (int count = 0; count < nums1.length; count++) {        //复制第一个数组
            newNums[count] = nums1[count];
        }
        for (int count = nums1.length, i = 0; count < newNums.length; count++, i++) {       //复制第二个数组
            newNums[count] = nums2[i];
        }
        double x = 0.0;
        Arrays.sort(newNums);               //进行排序
        if (newNums.length % 2 == 0) {      //数组长度是偶数
            x = (newNums[newNums.length / 2] + newNums[(newNums.length - 1) / 2]) / 2.0;        //注意这里是2.0
            return x;
        } else {                            //数组长度是奇数
            x = newNums[(newNums.length >> 1)];
            return x;
        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值