杨氏矩阵第K小值/两个数组元素之和最小值

来源:互联网 发布:sopcast这款网络电视 编辑:程序博客网 时间:2024/06/16 17:00

最近在面试中被问到一道算法题目:
给定两个有序数组A[]和B[],求A[i]+B[j]的第k小的。

不幸当场没给出答案。。。

回来查了一下,其实这个题目还可以转换为杨氏矩阵中第k小的值。不知道什么是杨氏矩阵的,可以自行百度。或者简单理解为一个每行每列都是递增的矩阵。

这道题目可以用二分法来解,具体算法如下:

    public int KthSum(int[] A, int[] B,int k){        int lenA=A.length;        int lenB=B.length;        int max=A[lenA-1]+B[lenB-1];        int min=A[0]+B[0];        return solve(A,  B,max, min , k);    }    public int solve(int[] A,int [] B,int max,int min, int k){        if(max==min)            return max;        int mid=(min+max)/2;        if(counter(mid, A, B)>=k)            return solve(A, B, max, mid+1, k);        if(counter(mid-1, A, B)<k)            return solve(A, B, mid-1, min, k);        return mid;    }    public int counter(int val,int[] A,int[] B){        int i=0;        int j=B.length-1;        int count=0;        while(i<A.length&&j>=0){            if(A[i]+B[j]>val){                count += A.length-i;                j--;            }else {                i++;            }        }        return count;    }
0 0