arrays合并两个数组_leetcode寻找两个正序数组的中位数

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

6bc20ea2de678bddb3807d9f3eeeda72.png

给定两个大小为 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

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:

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

示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

提示:

nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
通过次数268,312提交次数691,163

8b635b077477a58d1b5ac1715beef4da.png
在这里插入图片描述

代码有点长,思路很简单;
思路:
1、如果nums1为空,那么只需要查找第二个数组的中位数
2、如果nums2为空,那么只需要查找第一个数组的中位数
3、如果都不为空,就合并nums1和nums2,然后对合并后的数组做查找中位数的操作

 1package 其他.每日一题;
2
3import java.util.Arrays;
4
5class Solution {
6
7    static  public double findMedianSortedArrays(int[] nums1, int[] nums2) {
8
9        if(nums1.length==0)
10            return findMidArrays(nums2);
11        if(nums2.length==0)
12            return findMidArrays(nums1);
13
14        int[] hebing = hebing(nums1, nums2);
15//        System.out.println("合并好的数组:"+Arrays.toString(hebing));
16        return findMidArrays(hebing);
17    }
18
19    //合并数组
20    private static int[] hebing(int[] nums1, int[] nums2){
21        int len1 = nums1.length;
22        int len2 = nums2.length;
23        int[] newIntArray = new int[len1+len2];
24        int newIndex = 0;
25
26        int i = 0;
27        int j = 0;
28
29        while (len1!=0 && len2!=0){
30
31            if(nums1[i]>nums2[j]){
32                newIntArray[newIndex]=nums2[j];
33                len2--;
34                j++;
35            }else{
36                newIntArray[newIndex]=nums1[i];
37                len1--;
38                i++;
39            }
40            newIndex++;
41        }
42
43//        System.out.println(Arrays.toString(newIntArray));
44
45        //合并剩余的
46        if(len1!=0){
47            for (int k = i; k 48                newIntArray[newIndex]=nums1[k];
49                newIndex++;
50            }
51        }
52
53        if(len2!=0){
54            for (int k = j; k 55                newIntArray[newIndex]=nums2[k];
56                newIndex++;
57            }
58        }
59//        System.out.println(Arrays.toString(newIntArray));
60
61        return newIntArray;
62    }
63
64    //查找一个单独的数组中的中位数
65    private static double findMidArrays(int[] nums) {
66        if(nums.length==2){
67            return nums[0]+nums[1]==0?0:(nums[0]+nums[1]) / 2.0;
68        }
69
70       double midNumber = 0;
71
72//        int number = (nums.length-1)/2;
73        int numsLen = nums.length;
74
75        //有偶数个
76        if(numsLen%2==0){
77            int len = numsLen / 2;
78
79            midNumber = (nums[len] + nums[len-1]) / 2.0;
80
81        //有奇数个
82        }else{
83            numsLen = (nums.length/2)+1;
84            midNumber = nums[numsLen-1];
85        }
86
87        return midNumber;
88    }
89
90
91    public static void main(String[] args) {
92        System.out.println(findMedianSortedArrays(new int[]{1,2,3,4,5,6},new int[]{}));
93        System.out.println(findMedianSortedArrays(new int[]{1,3},new int[]{2}));
94    }
95
96}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值