I、題し
二次元アレイグリッドで、グリッド[i] [j]はどこかに位置する建物の高さを表しています。我々は、任意の数(異なる建物の数が異なる場合があります)、建物の高さを追加させました。0は、建物の高さと考えられています。
最後に、「スカイライン」を表示すべての4つの方向(すなわち、上、下、左、右)の新しい配列は元の配列のスカイラインと同じでなければなりません。街並みは、すべての建物の外側輪郭によって形成された矩形、遠くから見ています。次の例を考えてみましょう。
建物の高さの最大値の合計がどのくらいを増やすことができますか?1
例:
入力:グリッド= [3,0,8,4]、[2,4,5,7]、[9,2,6,3]、[0,3,1,0]]
出力: 35
説明:
グリッドである
:[[3,0 ,. 8 ,. 4]、
[2 ,. 4 ,. 5 ,. 7]
。、[9,2 ,. 6 ,. 3]
、[0 ,. 3 ,. 1 0]
垂直アレイからの方向(すなわち、上、下)は、 "スカイライン"を参照され[9、4、8、7]
横から"スカイライン"、水平方向を参照して(即ち、右、左)である[8、7、9、3]
建物がスカイラインに影響を与えることなく増加した後、新たな配列は次のとおり
。gridNew = [8 ,. 4 ,. 8 ,. 7]、
[7 ,. 4 ,. 7 ,. 7]、
[9 ,. 4 ,. 8 ,. 7 ]、
[3、3、3、3]
説明:
- 1 <grid.length =グリッド[0] .LENGTH <= 50。
- [0、100]:グリッド[i] [j]は高さ範囲です。
- 建物は、グリッドによって占め[I] [J]:他の言葉で、彼らは直方体の1×1×グリッド[i]の[j]をされています。
第二に、アイデア
ネストされたループ二回
最初のパス:
街並み、各行の最大値(列)、各サイクルを得るときに新たアレイに格納されている現在の値より大きくなると比較して得られたであろう電流の値として新しい値。そして、累計実際の高さを取得します。
第二のパス:
スカイラインの最小高さの対応する行の左側の標準高さのそれぞれの列に対応する全高拡張を取得、累積結果を得ることができます。
出力、実際の高さマイナスの高拡張。
第三に、コード
public class T0807 {
public static void main(String[] args) {
//第一个测试,输出结果为35
int[][] grid = {{3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0}};
System.out.println( maxIncreaseKeepingSkyline(grid) );
}
public static int maxIncreaseKeepingSkyline(int[][] grid) {
//用来存储水平和竖直方向的天际线
int l[] = new int[ grid[0].length ];
int r[] = new int[ grid.length ];
//扩展后的总高度,原本总高度
int result = 0, altitude = 0;
//获取每个方向的天际线,同行(列)最大值
//获取总高度
for ( int i = 0; i < grid.length; i++ ){
for ( int j = 0; j < grid[i].length; j++ ){
l[i] = Math.max( l[i], grid[i][j] );
r[j] = Math.max( r[j], grid[i][j] );
altitude += grid[i][j];
}
}
//获取扩展后的总高度,该行列对应天际线的最小值
for ( int i = 0; i < grid.length; i++ ){
for ( int j = 0; j < grid[i].length; j++ ){
result += Math.min( l[i], r[j] );
}
}
return result-altitude;
}
}
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/max-increase-to-keep-city-skyline:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。↩︎