你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。
你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。
给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。
示例 1:
输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2
示例 2:
输入:wall = [[1],[1],[1]]
输出:3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/brick-wall
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
因为输入是一个二维数组,因此我们可以将一维数组看成一行砖,例如示例1
输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2
第一行是[1,2,2,1],我们从这里分析,因为题目要求 穿过的砖块数量最少,所以对于每一行,我们需要关注的是砖块之间的空隙去进行插入,这样就能避免穿过砖块,因此我们需要记录每一行砖块空隙的位置
例如:
[1,2,2,1] 空隙坐标为 1,3,5(左端和右端不算空隙)
对于每一层我们使用map记录不同空隙坐标以及对应出现的次数,出现次数最多的空隙坐标代表了有多层砖块都在这个位置出现空隙,从这里穿过的空隙最小。
代码
func leastBricks(wall [][]int) int {m2 := make(map[int]int)n,res:=len(wall),0for i := 0; i < n; i++ {pre:=0for j := 0; j < len(wall[i])-1; j++ {pre+=wall[i][j]i2,ok := m2[pre]if ok{m2[pre]=i2+1}else {m2[pre]=1}if m2[pre]>res{res=m2[pre]}}}return n-res
}