554. 砖墙

66 阅读1分钟

554. 砖墙

image.png

上图对应的数据为 [ [1,2,2,1], [3,1,2], [1,3,2], [2,4], [3,1,2], [1,3,1,1] ] 第一行的有效间隙指的是 [1,3,5][1,2,2,3]的每一项的累加值,由于不包括最左的间隙,所以不累加最后一个值 1

此题就转化为求出每个子数组的累加和出现次数最多的值即间隙出现次数最多的行,然后用二维数组的长度即墙的高度减去最大间隙数即所求最少需要穿越的次数

解题思路

  1. 利用map记录累加和出现的次数
  2. 遍历 wall 数据 for of 取出子数组 widths,累加和做key
  3. 每次记录后与假设的最大累加值取较大值
  4. 最后用 wall.length - max 即穿越的最小砖块数目

代码

/**
 * @param {number[][]} wall
 * @return {number}
 */
var leastBricks = function (wall) {
    const map = new Map()
    let max = 0
    for (let widths of wall) {
        // 不统计最右边的缝隙
        let sum = 0
        for (let i = 0; i < widths.length - 1; i++) {
            sum += widths[i]
            if (map.has(sum)) {
                map.set(sum, map.get(sum) + 1)
            } else {
                map.set(sum, 1)
            }
            max = Math.max(map.get(sum), max)
        }
    }
    return wall.length - max
};