4. 寻找两个正序数组的中位数 | 刷题打卡

207 阅读12分钟

前言

美好的一天从刷leetcode开启, 冲冲冲!

题目描述

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

难度: 苦难啊!

示例:

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

来源:[leetcode-cn.com/problems/me…. 寻找两个正序数组的中位数)

解题思路

莽夫解法

初识题目 得题法:

1.  将两个数组进行合并  在进行排序(从小到大)

2. 根据得到得新的正序数组  利用数学求中位数的方法求得

3. 中位数求解方法: (num.length+1)为偶数    中位数为  num[(num.length+1)/2]

                                (num.length+1)为奇数   

                  中位数为  (num[((num.length+1)/2)]+num[((num.length+1)/2+1)])/2

AC代码

var b = function(nums1, nums2) {    
var num = nums2.concat(nums1)    
num = num.sort((a, b) => a - b)    
if((num.length+1)%2 == 0) {        
    return num[(num.length+1)/2-1]    
}else {        
    let num1 = parseInt((num.length+1)/2)        
    let middleNum = parseFloat((parseInt(num[num1]) + parseInt(num[num1-1]))/2)        
    return middleNum    
    }
};

虽然解决了  但是看数据才击败了9%得人  有点low啊!

"诸葛"解法

[缺陷]              莽夫解法中  未使用到两个数组为    【正序数组】

再审题目  得新法 :

1.  利用数学中位数求解方式   可得(当一个正序数组的长度为  len时,

                       len为奇数   要找到(len+1)/2这个元素

                       len为偶数   要找到(len+1)/2 和 (len+1)/2+1 这两个元素

2.  找到两个数组中  第k个大小的数

  • 首先两个数组得同时进行查找  找第k个元素,    第一个数组找0 到 k/2 的元素。第二个数组找0 到 k/2 的元素,     两个数组的num【k/2】,进行比较。那个小就舍掉 0 到 k/2 的元素
  • 然后又是进行重复    一个数组为满数组s1  另一个为舍弃数组s2  再进行找是s1 和 s2的中位数。 到了临界条件就停止循环
  • 临界条件: 如果一个数组为空,说明该数组中的所有元素都被排除,我们可以直接返回另一个数组中第 k小的元素。 如果 k=1,我们只要返回两个数组首元素的最小值即可。

AC代码

  // 找到第  k  个  元素  
var findK = function(nums1,nums2,k) {    
    var index1 = 0;    
    var index2 = 0;    
    let num1 = nums1.length;    
    let num2 = nums2.length;    
    var flag = -1;    
    while(flag == -1) {        
        if(index1 == nums1.length) {            
            flag = 1;            
            return nums2[index2-1+k]        
        }        
        if(index2 == nums2.length) {            
            flag = 1;            
            return nums1[index1-1+k]        
        }        
        if(k == 1) {            
            flag = 1;            
            return Math.min(nums1[index1],nums2[index2]);        
        }            
        half = parseInt(k/2);        
        let newindex1 = Math.min((index1 + half),num1) - 1;        
        let newindex2 = Math.min((index2 + half),num2) - 1;        
        let value1 = nums1[newindex1];        
        let value2 = nums2[newindex2];        
        if(value1  <=  value2) {            
            k = k - (newindex1 - index1 + 1)           
            index1 = newindex1 + 1;                  
        }else {            
           k = k - (newindex2 - index2 + 1)             
           index2 = newindex2 + 1;            
        }            
    }
}
var findMedianSortedArrays = function(nums1, nums2) {              
    // 判断两个数组的长度之和是否为偶数    
    let elmentK = parseInt( (nums1.length + nums2.length + 1) / 2)     
    if((nums1.length+ nums2.length)%2 == 0){        
        return parseFloat((findK(nums1,nums2,elmentK) + findK(nums1,nums2,elmentK+1))/2)    
    }else {        
        return parseFloat(findK(nums1,nums2,elmentK));    
    }                
}

总结

有时候想出一种解法,但不一定是最优的。只有虚心学习,才能更强。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情