Skip to content

Latest commit

 

History

History
77 lines (70 loc) · 1.98 KB

005.md

File metadata and controls

77 lines (70 loc) · 1.98 KB

两数组第K值

JS实现

版本一

function findKth(ary1,ary2,k) {
    // body...
    var high1 = ary1.length-1,
        high2 = ary2.length-1,
        mid1 = 0,
        mid2 = 0,
        low1=0,
        low2=0;
    if (k<1 || k>ary1.length+length) {return false;}
    while(true){        
        mid1 = low1+parseInt((high1-low1)/2);
        mid2 = low2+parseInt((high2-low2)/2);
        if (mid1+mid2+1 > k) {
            high1 = mid1-1;
            high2 = mid2-1;
        }else if (mid1+mid2+1 < k) {
            if (ary1[mid1] < ary2[mid2]) {
                low1 = mid1+1;
                low2 = mid2;
            }else{
                low1 = mid1;
                low2 = mid2+1;
            }
        }else{
            break;
        }
    }
    if (ary1[mid1] < ary2[mid2]) {
        return ary1[mid1];
    }else{
        return ary2[mid2];
    }
}

版本二

function findKth(ary1,ary2,k) {
    // body...
    var m = ary1.length,
        n = ary2.length;
    if (m>n) {findKth(ary2,ary1,k)}
    var low = 0,
        high = m-1,
        mid = 0,
        j = 0;
    while(low <= high){
        mid = low + parseInt((high-low)/2);
        j = k-1-mid;
        if (j > n-1 || ary2[j] > ary1[mid]) {
            low = mid + 1;
        }else{
            if(low == high){
                break;
            }else{
                high = mid;
            }
        }
    }
    var chech1 = low-1 >= 0?ary1[low-1]:Number.NEGATIVE_INFINITY;
    var check2 = k-1-low >=0?ary2[k-1-low]:Number.NEGATIVE_INFINITY;
    return Math.max(chech1,check2);
}

注:

1、版本二的效率更快,为log(min(m,n)).

测试用例

ary1 = [1,6,7,8,12,15];
ary2 = [3,4,9,10,16,20,25];

预期结果

console.log(findKth(ary1,ary2,10));//应该返回元素15