答案 0 :(得分:0)
您的方法会漏掉一些情况,例如:
如果数组由[2,3,0,2]组成->后排序,您将得到[0,2,2,3]。 现在,使用您的方法,您将返回“ 2”,而答案是“ 0”。
使用您的方法,您可能会错过时间复杂性约束。
要解决此问题,您可以使用修改后的合并排序,其最坏情况下的复杂度为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();