我有一个整数数组,其值有限.我的工作是找到数组中任何两个元素之间的最小差异.
考虑一下该数组包含
4, 9, 1, 32, 13
Run Code Online (Sandbox Code Playgroud)
这里差异最小在4到1之间,所以答案是3.
什么应该是解决这个问题的算法.另外,我不知道为什么但我觉得使用树木,这个问题可以解决相对容易.可以这样做吗?
das*_*ght 40
最小差异将是排序顺序中连续对之间的差异之一.对数组进行排序,并查看相邻数字对,寻找最小的差异:
int[] a = new int[] {4, 9, 1, 32, 13};
Arrays.sort(a);
int minDiff = a[1]-a[0];
for (int i = 2 ; i != a.length ; i++) {
minDiff = Math.min(minDiff, a[i]-a[i-1]);
}
System.out.println(minDiff);
Run Code Online (Sandbox Code Playgroud)
moo*_*kid 14
您可以利用以下事实:您正在考虑使用整数来生成线性算法:
虽然所有答案都是正确的,但我想展示负责n log n
运行时的基础算法.的分而治之发现两点之间的最小距离或在1-d平面查找最近点的方式.
一般算法:
这是我在Javascript中创建的示例:
// Points in 1-D
var points = [4, 9, 1, 32, 13];
var smallestDiff;
function mergeSort(arr) {
if (arr.length == 1)
return arr;
if (arr.length > 1) {
let breakpoint = Math.ceil((arr.length / 2));
// Left list starts with 0, breakpoint-1
let leftList = arr.slice(0, breakpoint);
// Right list starts with breakpoint, length-1
let rightList = arr.slice(breakpoint, arr.length);
// Make a recursive call
leftList = mergeSort(leftList);
rightList = mergeSort(rightList);
var a = merge(leftList, rightList);
return a;
}
}
function merge(leftList, rightList) {
let result = [];
while (leftList.length && rightList.length) {
// Sorting the x coordinates
if (leftList[0] <= rightList[0]) {
result.push(leftList.shift());
} else {
result.push(rightList.shift());
}
}
while (leftList.length)
result.push(leftList.shift());
while (rightList.length)
result.push(rightList.shift());
let diff;
if (result.length > 1) {
diff = result[1] - result[0];
} else {
diff = result[0];
}
if (smallestDiff) {
if (diff < smallestDiff)
smallestDiff = diff;
} else {
smallestDiff = diff;
}
return result;
}
mergeSort(points);
console.log(`Smallest difference: ${smallestDiff}`);
Run Code Online (Sandbox Code Playgroud)