JavaScript 中的绝对值和最小化

假设,我们有一个排序的整数数组,我们称之为 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