力扣 4. 寻找两个有序数组的中位数 C

这道题的重点在于时间复杂度  O(log(m+n)),看到这个一般都会想到二分法,因为二分法的时间复杂度是O(log(m+n))

下面是初始的一些想法,如果你想看更好的完整版的算法思路

  • A[k/2] = B[k/2],那么第 k 大的数就是 A[k/2]

  • A[k/2] > B[k/2],那么第 k 大的数肯定在 A[0:k/2+1] 和 B[k/2:] 中,这样就将原来的所有数的总和减少到一半了,再在这个范围里面找第 k/2 大的数即可,这样也达到了二分查找的区别了。

  • A[k/2] < B[k/2],那么第 k 大的数肯定在 B[0:k/2+1]和 A[k/2:] 中,同理在这个范围找第 k/2 大的数就可以了。

    class Solution {
    public:
        #  define INT_MAX   2147483647
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int m = nums1.size() , n = nums2.size();
            int left = (m + n + 1) / 2;//不用分奇偶
            int right = (m + n + 2) / 2;//因为偶数是同样的数字
            return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;
        }
        
         int findKth(vector<int>& nums1 , int i , vector<int>& nums2 , int j , int k)//设置函数找到第k个数
        {
           
            if( i >= nums1.size()) return nums2[j + k - 1];//nums1为空数组
            if( j >= nums2.size()) return nums1[i + k - 1];//nums2为空数组
            if(k == 1)  return min(nums1[i], nums2[j]);
            int midVal1 = (i+k/2-1 < nums1.size()) ? nums1[i+k/2-1]  : INT_MAX;//INT_MAX的情况之多发生一次,因为剩下的两个数组的元素的个数一定大于K;所以只会发生一次,并且这个数不会大于INT_MAX,因为第K个数不是数组中最大的数。
            int midVal2 = (j+k/2-1 < nums2.size()) ? nums2[j+k/2-1]  : INT_MAX;
            if(midVal1 < midVal2)
                return findKth( nums1 , i+k/2 ,  nums2 , j , k-k/2);
            else 
                return findKth(nums1, i, nums2, j + k / 2 , k - k / 2);
        }
    };

    这是采用了一种递归的思想来做的,只有前三个if会跳出循环。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值