leetcode0004寻找两个有序数组的中位数

题目描述
在这里插入图片描述

python解法

class Solution:
    def get_kth(self, nums1, nums2, k):
        # print(nums1, nums2, 'k=', k)
        m, n = len(nums1), len(nums2)
        if m == 0: return nums2[k-1]
        if n == 0: return nums1[k-1]
        if k == 1: return min(nums1[0], nums2[0])
        drop1, drop2 = min(k//2, m), min(k//2, n)   # 丢弃个数
        # print('m={},n={},k/2={},drop1={},drop2={}'.format(m,n,k//2,drop1,drop2))
        if nums1[drop1-1] <= nums2[drop2-1]:  # 丢弃nums1部分
            return self.get_kth(nums1[drop1:m], nums2, k-drop1)
        else:
            return self.get_kth(nums1, nums2[drop2:n], k-drop2)
    
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        m, n = len(nums1), len(nums2)
        # 整合奇偶数情况
        mid_left = self.get_kth(nums1, nums2, (m+n+1)//2)
        mid_right = self.get_kth(nums1, nums2, (m+n+2)//2)
        return (mid_left+mid_right)/2 

JavaScript解法

var findMedianSortedArrays = function(nums1, nums2) {
    var num = [];
			nums1.concat(nums2)
			num = nums1.concat(nums2);
			num.sort(comparenumbers);
			if (num.length % 2 == 1)
				return num[(num.length - 1) / 2];
			else
				return (num[num.length / 2 - 1] + num[num.length / 2]) / 2;
};
function comparenumbers(a,b){
			return a-b;
}

C++解法

运用归并的思想来完成n + m 的时间复杂度。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1=nums1.size();
        int len2=nums2.size();
        int k1=len1+len2;
        int k=(len1+len2)>>1;
        vector<int> num;
        int temp1=0,temp2=0;
        while(temp1<=len1-1||temp2<=len2-1){
            if(temp2>=len2||(temp1<=len1-1&&nums1[temp1]<=nums2[temp2])){
                num.push_back(nums1[temp1]);
                temp1++;
            }else{
                num.push_back(nums2[temp2]);
                temp2++;
            }
            if(num.size()>=k+1) break;
        }
        double ans;
        int s=num.size();
        if(k1%2){
            ans=(double)num[s-1];
        }else{
            ans=((double)num[s-1]+(double)num[s-2])/2.0;
        }
        return ans;
    }
};

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值