首页 > 试题广场 >

两个升序数组的中位数

[编程题]两个升序数组的中位数
  • 热度指数:1070 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个长度为 n 和 m 的升序数组(后一个数一定大于等于前一个数),请你找到这两个数组中全部元素的中位数。

数据范围: ,数组中的元素满足
示例1

输入

[1,2,3,4,5],[6,7,8,9]

输出

5
示例2

输入

[1,2,3,8,9],[4,5,6,7]

输出

5
示例3

输入

[1,3,4],[1,4,4]

输出

3.5
自测的时候说我的输出5.000与5不符,但是直接提交的话就过了。
发表于 2023-02-01 09:56:50 回复(0)
什么垃圾题目,一直报错,还返回 double, 如果自测不算错的话,这道题最多算个入门难度:
 public double Median (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {
        // write code here
        // write code here
        ArrayList<Integer> sumList = new ArrayList<>(nums1.size() + nums2.size());
        int index1 = 0, index2 = 0;

        while (index1 < nums1.size() && index2 < nums2.size()) {
            Integer left = nums1.get(index1);
            Integer right = nums2.get(index2);

            if (left < right) {
                sumList.add(left);
                index1++;
            } else {
                sumList.add(right);
                index2++;
            }

        }
        // nums2 有剩余
        if (index1 == nums1.size()) {
            for (int i = index2; i < nums2.size(); i++)
                sumList.add(nums2.get(i));

        } else {
            // nums1 有剩余
            for (int i = index1; i < nums1.size(); i++)
                sumList.add(nums1.get(i));
        }

        int resLen = sumList.size();
        // 返回奇偶下标
        return   (resLen & 1) == 1 ? sumList.get(resLen / 2)
                 : (sumList.get(resLen / 2 - 1) + sumList.get(resLen / 2)) / 2.0;
    }


发表于 2024-04-26 09:05:10 回复(0)

提交可以通过,测试用例说输出与预期不符  
编辑于 2024-03-25 10:14:25 回复(0)
class Solution:
    def Median(self , nums1: List[int], nums2: List[int]) -> float:
        # write code here
        nums1.extend(nums2)
        nums1.sort()
        l = len (nums1)
        if l % 2 == 0:
            return (nums1[int(l/2)]+nums1[int(l/2-1)])/2
        else:
            return (int(nums1[int((l-1)/2)]))
发表于 2024-02-23 10:25:40 回复(0)
export function Median(nums1: number[], nums2: number[]): number {
    // write code here
    let res:number=0
    let newArr:Array<number>=[...nums1,...nums2].sort((a,b)=>a-b)
    if(newArr.length%2!==0){
        res=newArr[(newArr.length-1)/2]
    }else{
        res=(newArr[newArr.length/2-1]+newArr[newArr.length/2])/2
    }
    return res
}
发表于 2023-06-22 12:26:24 回复(0)
    public double Median (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {
        // write code here
        nums1.addAll(nums2);
        Collections.sort(nums1);
        int n=nums1.size();
        double t=0;
        if(n%2 ==0) t=(double)(nums1.get(n/2 -1)+ nums1.get(n/2))/2;
        else t=nums1.get(n/2);
        return t;
    }

发表于 2022-06-11 20:29:26 回复(0)

class Solution {
public:

int findKth(vector<int>::const_iterator A, int m, vector<int>::const_iterator B, int n, int k) {
    if (m > n)    return findKth(B, n, A, m, k);
    if (m==0)    return B[k-1];
    if (k==1)    return min(A[0], B[0]);
    int ia = min(m, k/2), ib = k - ia;
    if (A[ia-1] < B[ib-1]) {
        return findKth(A + ia, m - ia, B, n, k - ia);
    } else if (A[ia-1] > B[ib-1]) {
        return findKth(A, m, B + ib, n - ib, k - ib);
    } else {
        return A[ia-1];
    }        
}

double Median(vector<int>& nums1, vector<int>& nums2) {
    // write code here
    int m = nums1.size();
    int n = nums2.size();
    int total = m + n;
    if (total & 1) {
        return findKth(nums1.begin(), m, nums2.begin(), n, total/2+1);
    } else {
        return (findKth(nums1.begin(), m, nums2.begin(), n, total/2+1) + findKth(nums1.begin(), m, nums2.begin(), n, total/2)) * 0.5;
    }
}

};

发表于 2022-04-23 01:05:54 回复(0)