leetcode4. Median of Two Sorted Arrays

题目链接leetcode4. Median of Two Sorted Arrays
难度等级:hard

思路

首先要观察到, a[0 … (n - 1)] 和 b[0 … (m - 1)], 对于 0<= i <= (n - 1), 0 <= j <= (m - 1)
min_one = min(a[i], b[j]), 则, min_one在a和b数组的合集的升序的索性值 index <= i + j.
如果要求全集的升序序列的第k个元素,如果 i + j < (k - 1)
如果min_one == a[i] ( min_one == b[j[ 情况类似)
则 kth(a[0 … (n - 1)], b[0 … (m - 1)], k) == kth(a[(i + 1) … (n - 1)], b[0 … (m - 1)], k-i-1)
基于以上的观察, 那么求第k个元素, 可以构造i = j = k/2 - 1(但是要注意a和b数组的长度),然后就可以分治求更小范围内的子问题了。时间复杂度

O(lg(m+n))

实现

class Solution {
public:
    int findKthNum(vector<int> & nums1, int l1, int r1, vector<int> & nums2, int l2, int r2 , int k);
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int size1 = nums1.size(), size2 = nums2.size();
        int mid1 = (size1 + size2 + 1) / 2;
        int mid2 = (size1 + size2 + 2) / 2;
        return (this->findKthNum(nums1, 0, size1 - 1, nums2, 0, size2 - 1, mid1) 
                + this->findKthNum(nums1, 0, size1 - 1, nums2, 0, size2 - 1, mid2)) / 2.0; 
    }
};

int Solution::findKthNum(vector<int> & nums1, int l1, int r1, vector<int> & nums2, int l2, int r2 , int k) {
    if(l1 > r1)
        return nums2[l2 + k - 1];
    if(l2 > r2)
        return nums1[l1 + k - 1];

    if(k == 1)
        return nums1[l1] <= nums2[l2] ? nums1[l1] : nums2[l2];

    int mid = k / 2 - 1;
    int mid1 = (l1 + mid) <= r1 ? (l1 + mid) : r1;
    int mid2 = (l2 + mid) <= r2 ? (l2 + mid) : r2;

    if(nums1[mid1] < nums2[mid2])
        return this->findKthNum(nums1, mid1 + 1, r1, nums2, l2, r2, k - (mid1 - l1 + 1));
    else
        return this->findKthNum(nums1, l1, r1, nums2, mid2 + 1, r2, k - (mid2 - l2 + 1));
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值