每天一到算法题之——寻找两个正序数组的中位数

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

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

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

这个题,首先想到的是,将两个数组先合并,然后再找出其中位数。那么时间复杂度就主要是在两个数组的合并上了。下面是我的渣渣暴力求解思想:(数组索引从0开始)

input int[] nums1, int[]nums2, int []nums
output int med
1.nums1和nums2的长度不为0,转至2;nums1的长度为0,转至3;nums2的长度为0,转至4;
2.循环比较nums1中与nums2中的每一个元素,将较小的一个放入nums;当nums1为遍历完毕时,将nums2中剩与的元素直接放入nums;当nums2遍历完毕时,将nums1中剩余的元素直接放入nums;转至5;
3.nums=nums2;转至5;
4.nums=nums1;转至5;
5.判断nums的长度是否为奇数,如果为奇数,则中位数为nums.length/2;如果为偶数,则中位数为(nums.length/2+nums.length/2-1)/2。

下面就是我的渣渣实现:

 /*
    *思路:首先将两个有序数组合为1个数组。然后找出数组的中位数。
    *如何合并?两个数组存在几种情况:1.两个数组都不为null的情况;2.nums1数组为null的情况
    *3.nums2为空的情况;4.两个数组都为null的情况。
    *对于1:遍历两个数组,比较两个数组中元素的大小,将其中元素小的放入新的数组;当有一个数组遍历完毕时,将
    *       另一个数组直接加入新的数组;
    *对于2:直接将nums2数组元素放到新的数组中;
    *对于3:直接将nums1数组元素放到新的数组中;
    *对于4:返回0;
    *如何找出中位数?这个就很简单啦。
    */
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    
    
       int length1=nums1.length;
       int length2=nums2.length;
       int [] nums=new int[length1+length2];
        int k=0;
       if(length1!=0&&length2!=0){
    
    
           int i=0;
           int j=0;
           while(i<length1&&j<length2){
    
    
               if(nums1[i]<=nums2[j])
                   nums[k++]=nums1[i++];
               else
                    nums[k++]=nums2[j++];
           }
           if(i<length1) {
    
    
               while(i<length1)
                   nums[k++]=nums1[i++];
           }
           if(j<length2) {
    
    
               while(j<length2)
                  nums[k++]=nums2[j++];
           }
            int length=nums.length;
           if(length%2==0)
               return ((double)nums[length/2]+(double)nums[length/2-1])/2;
           else
                return nums[length/2];

       }

       if(length1==0){
    
    
           nums=nums2;
            int length=nums.length;
           if(length%2==0)
               return ((double)nums[length/2]+(double)nums[length/2-1])/2;
           else
                return nums[length/2];

       }
       if(length2==0){
    
    
           nums=nums1;
            int length=nums.length;
           if(length%2==0)
               return ((double)nums[length/2]+(double)nums[length/2-1])/2;
           else
                return nums[length/2];

       }
       return 0.0d;
    }

猜你喜欢

转载自blog.csdn.net/weixin_43763175/article/details/109633472