查找数组中两个不同元素之间的最小距离

时间:2018-07-01 05:31:28

标签: c algorithm

我尝试使用对数组进行排序来解决以下问题,并返回数组的第二个元素和数组的第一个元素之间的差。 但是它并没有通过整个测试案例,正确率是42%

那是错误的方法吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

您的方法会漏掉一些情况,例如:

  1. 如果数组由[2,3,0,2]组成->后排序,您将得到[0,2,2,3]。 现在,使用您的方法,您将返回“ 2”,而答案是“ 0”。

  2. 使用您的方法,您可能会错过时间复杂性约束。

要解决此问题,您可以使用修改后的合并排序,其最坏情况下的复杂度为O(nlog(n))。

尝试下面的代码,尽管它是用Javascript编写的,但是您可以弄清楚背后的逻辑。我希望这可以解决您的问题。

let dist = -1;
function checkDist(a,b) {
    let cnt = Math.abs(a - b);
    if(cnt < dist || -1 === dist)
        dist = cnt;
}

function mergeSort(a, l, r){
    if(l<r){
        let m = l + parseInt((r-l)/2);
        a = mergeSort(a, l, m);
        a = mergeSort(a, m+1, r);
        a = merge(a, l, m, r);
    }
    return a;
}

function merge(a, l, m, r){
    let pa = l, pb = m+1, i = 0;
    let temp = [];

    while(pa < m+1 && pb < r+1){
        if(a[pa] <= a[pb]){
            checkDist(a[pa], a[pb]);
            temp[i] = a[pa];
            pa++;
        } else {
            checkDist(a[pa], a[pb]);
            temp[i] = a[pb];
            pb++;
        }
        i++;
    }
    while(pa < m+1){
        checkDist(a[pa], a[m+1]);
        temp[i] = a[pa];
        i++;
        pa++;
    }
    while(pb < r+1){
        checkDist(a[r+1], a[pb]);
        temp[i] = a[pb];
        i++;
        pb++;
    }

    let k = l;
    for(let e of temp){
        a[k] = e;
        k++;
    }

    return a;
}

function main() {
    let a = [3,20,1,17]; //--->INPUT ARRAY
    let r = a.length - 1;
    mergeSort(a, 0, r);
    console.log('Min Distance->', dist);
    console.log('Sorted Array->', a);
}

main();