<aside> 💡 一共三道算法题,涵盖一维数组、二维矩阵和二叉树遍历问题。本人并没有很系统地学习过算法,所以水平有限,很多思路和注释比较 egoism,请多包涵。由于自己平时 JS / TS 用的比较多,所以以下题解均使用 ES6 书写。(Date: 26/02/2021)
</aside>
给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为 10000。
元素 A 范围:[1, 6]
数组大小 N 范围:[1, 10000]
解题思路:较容易的一道题,也可以说是一道数学题,排序后找中位数,然后计算每个元素与中位数的相对值并加和,时间复杂度 O(N)
function solution(A) {
const list = A.sort((a, b) => a - b) // 排序
let i = 0
let j = list.length - 1
const mid = Math.floor((i + j) / 2) // 获取中位数索引,如果长度为偶数,则取靠左的元素索引
let count = 0
// 双指针遍历,进行 n // 2 次循环
while (i <= mid) {
count += Math.abs(list[i] - list[mid]) // 计算左指针所对应元素数值与中位数相对值
count += Math.abs(list[j] - list[mid]) // 计算右指针所对应元素数值与中位数相对值
// 指针向中遍历,到左指针到达中位数索引时停止
i++
j--
}
return count
}