タイトル
【砖墙】
煉瓦壁は、行のリストで表されます。各行は左から右に、この行の各ブリックの幅を表す整数のリストです。
あなたの行はレンガのエッジを通過する場合に渡ったとして、その後、レンガは考慮されていません。あなたは少なくともレンガを渡り、交差レンガの数を返すように線を描画する方法を見つける必要があります。
あなただけの行は明らかに何のレンガを横断しません、その場合には、壁の二つの垂直エッジの一方に沿って線を引くことはできません。
例:
入力:[1,2,2,1]、
[3,1,2]、
[1,3,2]、
[1,2,4]、
[3,1,2]、
[1,3,1、 1]]
出力:2
説明:
注:
異なる行のレンガの幅の合計は同じであり、INT_MAXを超えることはありません。
各列の煉瓦の数は範囲[1,10,000]です。壁の高さは、範囲[1,10,000]です。壁のレンガの合計数20,000を超えることはありません。
思考
对墙中所有可能的缝隙长度(该缝隙到达最左边缘的长度)进行计数。
某长度以及对应出现的次数作为<key,value>维护到map中。
最后出现次数最多的长度就是画线的最佳位置(说明此位置缝隙最多,换言之,穿过的砖头最少)
コード
class Solution {
public int leastBricks(List<List<Integer>> wall) {
if(wall.size() == 0) return 0;
int count = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// 遍历每一行
for(List<Integer> list : wall){
int length = 0;
// 对所有出现的长度计数并更新到map中
for(int i = 0; i < list.size() - 1; i++){ //不考虑最右边的砖
length += list.get(i);
map.put(length, map.getOrDefault(length, 0) + 1);
// 更新穿过最多的缝隙数
count = Math.max(count, map.get(length));
}
}
// 穿过的砖数 = 总行数 - 穿过的缝隙数
return wall.size() - count;
}
}