<aside> 💡 一共三道算法题,涵盖一维数组、二维矩阵和二叉树遍历问题。本人并没有很系统地学习过算法,所以水平有限,很多思路和注释比较 egoism,请多包涵。由于自己平时 JS / TS 用的比较多,所以以下题解均使用 ES6 书写。(Date: 26/02/2021)

</aside>

1. 最少移动次数使数组元素相等


给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为 10000。

元素 A 范围:[1, 6]

数组大小 N 范围:[1, 10000]

样例

  1. [ 1, 2, 3 ] → [ 2, 2, 2 ] 共需要 2 次
  2. [ 3, 1, 2, 3 ] → [ 3, 3, 3, 3 ] 共需要 3 次

详细题解

解题思路:较容易的一道题,也可以说是一道数学题,排序后找中位数,然后计算每个元素与中位数的相对值并加和,时间复杂度 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
}

2. 求矩阵中路径上元素乘积尾随零个数最多时的,该路径元素乘积的尾随零的个数