二分查找——Median of two Sorted Arrays

本题为在两个排序数组中找第K大的数的一个特殊情况——第(A.length+B.length)/2大的数。


使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。


使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。

1.A[K/2-1] <= B[K/2-1],A和B合并后的第K大数中必包含A[0]~A[k/2-1],可用归并的思想去理解。

2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。


接下来考虑特殊情况:

1.A,B都为空,或一个为空。

2.A+B的长度为偶数时返回len/2和len.2+1的均值,为奇数时返回len/2+1处的值。

3.findFunc利用了递归的方法,判断递归条件的判断非常重要:可以利用极端情况时的参数来入手,即看[ ]A.[ ]B,k谁先达到了极端的情况。

import java.util.*;
public class Solution {
    public double findMedianSortedArrays(int A[], int B[]) {
        if(A == null||B == null||(A.length == 0 && B.length == 0))
            return 0;
        int len=A.length+B.length;
        if(len%2 == 0)
            return (findFunc(A,B,0,0,len/2)+findFunc(A,B,0,0,len/2+1))/2.0;
        else
            return findFunc(A,B,0,0,len/2+1);
    }
    public int findFunc(int[] A,int[] B,int A_start,int B_start,int k)
        {
        if(A_start >= A.length)
            return B[B_start+k-1];
        if(B_start >= B.length)
            return A[A_start+k-1];
        if(1 == k)
            return Math.min(A[A_start],B[B_start]);
        
        int A_value=A_start+k/2-1 >= A.length?Integer.MAX_VALUE:A[A_start+k/2-1];
        int B_value=B_start+k/2-1 >= B.length?Integer.MAX_VALUE:B[B_start+k/2-1];
        if(A_value < B_value)
            return findFunc(A,B,A_start+k/2,B_start,k-k/2);
        else
            return findFunc(A,B,A_start,B_start+k/2,k-k/2);    
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值