• 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数


    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    You may assume nums1 and nums2 cannot be both empty.

    Example 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    The median is 2.0
    

    Example 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    The median is (2 + 3)/2 = 2.5

    class Solution {
    public:
            /*
        对于一个长度为n的已排序数列a,若n为奇数,中位数为第(n/2+1)个数 , 
        若n为偶数,则中位数=[第(n/2)个数 + 第(n/2+1)个数] / 2
        如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
        不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
        取A[k / 2] B[k / 2] 比较,
        如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
        反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的
        k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
        如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。
        */
        double findKth(vector<int>& A, vector<int>& B, int A_st, int B_st, int k) {  //经典函数
            // 边界情况,任一数列为空
            if (A_st >= A.size()) {
                return B[B_st + k - 1];
            }
            if (B_st >= B.size()) {
                return A[A_st + k - 1];
            }
            // k等于1时表示取最小值,直接返回min
            if (k == 1) return min(A[A_st], B[B_st]);
            int A_key = A_st + k / 2 - 1 >= A.size() ? INT_MAX : A[A_st + k / 2 - 1];
            int B_key = B_st + k / 2 - 1 >= B.size() ? INT_MAX : B[B_st + k / 2 - 1];
            if (A_key < B_key){
                return findKth(A, B, A_st + k / 2, B_st, k - k / 2);
            } else {
                return findKth(A, B, A_st, B_st + k / 2, k - k / 2);
            }
            
        }
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int sum = nums1.size() + nums2.size();
            double ret;
            
            if (sum & 1) {
                ret = findKth(nums1, nums2, 0, 0, sum / 2 + 1);
            } else {
                ret = ((findKth(nums1, nums2, 0, 0, sum / 2)) +
                        findKth(nums1, nums2, 0, 0, sum / 2 + 1)) / 2.0;
            }
            return ret;
        }
    };
  • 相关阅读:
    1467E. Distinctive Roots in a Tree(可持久化线段树+树上差分)
    1473E. Minimum Path(最短路+三维DP)
    LeetCode88. 合并两个有序数组
    LeetCode75. 颜色分类
    LeetCode80. 删除排序数组中的重复项 II
    定义企业结构-后勤配置
    查看清账凭证
    表T043S中,XXXX输入丢失
    过账,未清项管理,银行中转科目
    PK码
  • 原文地址:https://www.cnblogs.com/sherry-yang/p/10772139.html
Copyright © 2020-2023  润新知