题解 | #NC413 两个升序数组的中位数#

两个升序数组的中位数

http://www.nowcoder.com/practice/b3b59248e61f499482eaba636305474b

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums1 int整型vector 
     * @param nums2 int整型vector 
     * @return double浮点型
     */
    double Median(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        int mid1 = (m + n + 1) / 2;
        int mid2 = (m + n + 2) / 2;
        return (getKthElement(nums1, 0, nums2, 0, mid1) + getKthElement(nums1, 0, nums2, 0, mid2)) / 2.0;
     }
     //在两个有序数组中找到第k个元素(例如找第一个元素,k=1,即nums[0])
    //i: nums1的起始位置 j: nums2的起始位置(i,j都是从0开始)
    int getKthElement(vector<int>& nums1, int i, vector<int>& nums2, int j, int k) {
        //若nums1为空(或是说其中数字全被淘汰了)
        //在nums2中找第k个元素,此时nums2起始位置是j,所以是j+k-1
        if (i >= nums1.size()) return nums2[j + k - 1];
        if (j >= nums2.size()) return nums1[i + k - 1];
        
        //递归出口
        //当K=1时候,相当于求最小值,我们只要比较nums1和nums2的起始位置i和j上的数字就可以了。
        if (k == 1) return min(nums1[i], nums2[j]);
        //这两个数组的第K/2小的数字,若不足k/2个数字则赋值整型最大值,以便淘汰另一数组的前k/2个数字
        int mid1 = i + k / 2 - 1 < nums1.size() ? nums1[i + k / 2 - 1] : INT_MAX;
        int mid2 = j + k / 2 - 1 < nums2.size() ? nums2[j + k / 2 - 1] : INT_MAX;
        
        //二分
        if (mid1 < mid2) {
            return getKthElement(nums1, i + k / 2, nums2, j, k - k / 2);
        } else {
            return getKthElement(nums1, i, nums2, j + k / 2, k - k / 2);
        }
    }
};
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务