题目链接
题目描述
你的面前有一堵矩形的、由
n
n
n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和相等。
你现在要画一条自顶向下的、穿过最少砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。
给你一个二维数组 w a l l wall wall ,该数组包含这堵墙的相关信息。其中, w a l l [ i ] wall[i] wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量
示例1
输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
输出:2
提示:
n
=
=
w
a
l
l
.
l
e
n
g
t
h
n == wall.length
n==wall.length
1
≤
n
≤
1
0
4
1 \leq n \leq10^4
1≤n≤104
1
≤
w
a
l
l
[
i
]
.
l
e
n
g
t
h
≤
104
1 \leq wall[i].length \leq 104
1≤wall[i].length≤104
1
≤
s
u
m
(
w
a
l
l
[
i
]
.
l
e
n
g
t
h
)
≤
2
∗
104
1 \leq sum(wall[i].length) \leq 2 * 104
1≤sum(wall[i].length)≤2∗104
对于每一行
i
i
i,
s
u
m
(
w
a
l
l
[
i
]
)
sum(wall[i])
sum(wall[i]) 是相同的
1
≤
w
a
l
l
[
i
]
[
j
]
≤
2
31
−
1
1 \leq wall[i][j] \leq 2^{31} - 1
1≤wall[i][j]≤231−1
建立一个 h a s h hash hash,键值代表缝隙端点,寻找缝隙权值的最大值,末尾的最后一个缝隙不计算,然后遍历一下砖的总长度寻找最大值,最后的只需要总长度 - 权值最大值就是答案
class Solution {
public:
int leastBricks(vector<vector<int>>& wall) {
unordered_map<int,int> hash;
int n = wall.size();
for(int i = 0; i < n; i++)
{
int m = wall[i].size()-1, t = 0;
for(int j = 0; j < m; j++)
{
t += wall[i][j];
hash[t]++;
}
}
int res = 0;
for(unordered_map<int,int>::iterator it = hash.begin(); it != hash.end(); it++)
res = max(res,it->second);
return n - res;
}
};