假设,我们有一个排序的整数数组,我们称之为 arr。我们需要找到这样一个整数 x 的值 -
abs(a[0] - x) + abs(a[1] - x) + ... + abs(a[a.length - 1] - x)
是可能的最小值(这里 abs 表示绝对值)。如果有多个可能的答案,则输出最小的一个。
例如 -
为了,
arr = [2, 4, 7],
输出应该是 -
absoluteValuesSumMinimization(arr) = 4
因为 abs(2 - 4) + abs(4 - 4) + abs(7 - 4) = 5 这是我们可以用任何数字实现的最小值。
我们知道,
arr.length/2
返回一半的长度。
对于偶数长度的数组,这将在中间的右侧。对于奇数长度的数组,它将是中间的。
Math.ceil(arr.length/2) 如有必要会向上舍入,因此 5 数组的中间值为 2.5 -> 3。这使得奇数长度数组减一。
Math.ceil(arr.length/2)-1 下降一个索引。这将纠正所有阵列的一对一错误。
以下是代码 -
const arr = [2, 4, 7]; const absoluteValuesSumMinimization = (arr = []) => { const res = []; arr.forEach(num => { const sum = arr.reduce((accum, next) => { return accum + Math.abs(next - num); }, 0); res.push(sum); }); const lowest = Math.min(...res); return arr[res.indexOf(lowest)]; }; console.log(absoluteValuesSumMinimization(arr));输出结果
以下是控制台上的输出 -
4