leetcode 554. 砖墙

你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。

你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。

给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。
leetcode 554. 砖墙_第1张图片

示例 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),0
	for i := 0; i < n; i++ {
		pre:=0
		for 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
}

你可能感兴趣的:(leetcode,算法,leetcode)