Swift中的Leetcode解决方案和思想—问题554

矩阵和哈希表

难度:中等

录取率:46.5%

你面前有一堵砖墙。 墙是矩形的,有几排砖头。 砖块的高度相同,但宽度不同。 您想要从顶部 到底部绘制一条垂直线,并穿过最少的砖块。

砖墙由行列表表示。 每行是一个整数列表,从左到右代表该行中每个砖的宽度。

如果您的线穿过砖的边缘,则该砖不视为交叉。 您需要找出如何绘制线以穿过最小的砖并返回交叉的砖的数量。

您不能仅沿着墙的两个垂直边缘之一绘制一条线,在这种情况下,该线显然不会穿过任何砖块。

这个问题是相当困难的。

我们需要知道的前两件事是墙的宽度高度 。 从宽度和高度,我们可以首先创建一个像这样的矩阵:

每个“ 0”表示那里的空间被砖块阻塞。
我们希望矩阵变成这样:

其中1表示两个积木之间的交集(或未交叉)。
因此,我们要做的是在各列之间找到最大的加1。

完整的方法如下所示:

该解决方案的复杂度基本上是O(n²),但是我们首先创建一个矩阵,并且还有其他for循环,这使得运行时间超出了时间限制。

矩阵似乎不是一个好主意,所以让我们以哈希表的方式进行。

在第3行,我们首先创建一个字典,以注意每列未越过多少块砖,

然后我们遍历砖墙,我们知道当柱位于砖之间时,柱上不会有任何砖交叉。 循环时替换mostCrossed变量。 该解决方案的复杂度也是O(n²),但是借助哈希表,显然更快。