LeetCode之寻找两个正序数组的中位数

寻找两个正序数组的中位数

一、题目及要求

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

示例 1:
nums1 = [1, 3] nums2 = [2]
则中位数是 2.0

示例 2:
nums1 = [1, 2] nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5。

二、题目分析

(1)理解题意

  • 这道题给定了两个数组,要求求其中位数,我采取的方法时将两个数组合并为一个ArrayList集合,然后对集合采取操作。
  • 合并数组的方式我们采取循环将数组内的元素遍历,然后使用创建的list集合中的 add() 方法进行添加。
  • 然后使用list集合中的sort方法将集合排序(从小大大)
  • 接着判断使用 list.size() 方法判断集合的长度,得到集合的长度后,我们判断他的奇偶性,如果是奇数那么采用 list.get((list.size()-1)/2) 方法得到中位数,如果是偶数,则先求出 list.size()/2 的值,然后使用 list.get() 方法获取 list.size()/2 为索引 的数,以及索引为 list.size()/2-1 的数(注:这里获取出来的数的类型都为 Integer 类型,为什么第二个数的索引要-1呢?原因很简单,集合索引的开始为0)。

(2)具体操作

  1. 创建集合,并将数组中的元素添加进list集合中。
 ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < nums1.length; i++) {
            list.add(nums1[i]);
        }
        for (int j = 0; j < nums2.length; j++) {
            list.add(nums2[j]);
        }
  1. 使用 sort() 方法对list集合进行排序。
 list.sort(Integer::compareTo);
  1. 判断集合长度的奇偶性,并计算中位数(注意强转,integer计算完后还是interger类型的)
double b= 0 ;
        if (list.size()%2==0){
          int num = list.size()/2;
            Integer integer = list.get(num-1);
            Integer integer1 = list.get(num);
            //注意强转
            b = (double) (integer+integer1)/2;
        }else {
           b= list.get((list.size()-1)/2);
        }

        return b;

三、完整代码

import java.util.ArrayList;

public class Test5 {
    public static void main(String[] args) {
        int[] num1 = {1,3};
        int[] num2 = {2,4};
        double m = findMedianSortedArrays(num1, num2);
        System.out.println(m);
    }

    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {

        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < nums1.length; i++) {
            list.add(nums1[i]);
        }
        for (int j = 0; j < nums2.length; j++) {
            list.add(nums2[j]);
        }

        list.sort(Integer::compareTo);
        System.out.println(list);
        double b= 0 ;
        if (list.size()%2==0){
          int num = list.size()/2;
            Integer integer = list.get(num-1);
            Integer integer1 = list.get(num);
            b = (double) (integer+integer1)/2;
        }else {
           b= list.get((list.size()-1)/2);
        }

        return b;
    }
}


四、代码缺陷

  • 该代码会在运行速度上会有所欠缺,毕竟采取的是for循环遍历数组添加元素,一旦数组元素过多,就会很耗时。希望大家能帮助我改进代码,欢迎大家来交流!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值