求两个有序数组合并后的中位数

leet code 4 Median of Two Sorted Arrays

题意:给定两个有序数组nums1和nums2,大小分别为m和n,返回两个已排序数组的中位数,时间复杂度为O(log (m+n))。

分析:中位数的求法:若数组长度为奇数,则为中间数;若数组长度为偶数,则为中间两数和/2
对于两个有序数组,如果使用归并排序合成一个数组,时间复杂度为O(m+n),不可行。
此时需要利用中位数的位置:
从0开始的中位数下标mid0 = (m+n) /2
(m+n奇数时是中位数下标,偶数时是中间靠右第一个数下标)
设找到中位数时,在nums1数组上的下标为i,nums2数组上的下标为j,i+j=mid0-1。而nums1[i] <= nums2[j+1]nums2[j] <= nums1[i+1], j+1、i+1都在坐标范围内。
i可能的值为-1(不取nums1)、0、1…m-1。
i=-1的情况单独判断。i从m-1位置开始,若nums1[i] > nums2[j+1],往左边跳,i = i/2,缓存位置pre;若nums1[j] > nums2[i+1],往右边跳,i = (i + pre) /2
i和j图

代码Java版:

	public double findMedianSortedArrays(int[] nums1, int[] nums2) {
   
        int size1 = nums1.length, size2 = nums2.length;
        int size = size1 + size2;
        if (size == 0) return 0.0;
        boolean flag = ((size & 1) == 1);
        //偶数需要中间两个数
        //奇数只需要中位数
        int mid0 = size >> 1; //从0开始的中位数下标
        //若为奇数, 是中间数的下标;若为偶数,是中间靠右第一个数的下标。
        
        //让程序始终遍历数组长度最短的
        return size1 <= size2 ? calcV(nums1, nums2, size1, size2, mid0, flag) :
                calcV(nums2, nums1, size2, size1, mid0, flag);
    }

	public double calcV(int nums1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值