ブログで、それは、行の計算アップ層です。私は問題だと思いませんが、合格しませんでした。ユースケースは、ローカルセルフテストに長すぎることはできませんので
- アイデアは、水柱を保存することができますどのくらいの存在にある
最高の左の列、および柱に右まで、並びにその下には:依存するメモリの現在の列が多くの水を格納することができ
柱列の長さが3未満(あるとき、想像することができますheight.length<=2
)、水を充填することができません直接バック0には
短く、最短付近のピークに応じて、多くの水を保持することができint temp = Math.min(leftHigh,rightHigh) - height[i];
、底は水容量で満たされている減算します。(それは水で満たされていないため、負または0の場合)
まあ今の考えは非常に明確である、我々は唯一の3つのデータ、左側の最高峰知っている必要がありleftHigh
、ピークの右側にrightHigh
、現在の下部にheight[i]
見つけることができ、現在の列をどのくらいの水であってもよいです
現在のすべてのカラム(高さ[1]、最後の列に2番目)は、総容量を得るために合計されます
結果:によって
実行時:130ミリ秒、すべてのJava提出で勝利5.06パーセントを超えるユーザーの
メモリ消費量:39.9メガバイト、すべてのJava提出で勝利11.78パーセントを超えるユーザーの
しかし私は、アルゴリズムは効率的ではないことを確認することができますどのような自転車に!何を見るために
それを言うために彼の腹を埋めます
- コードは以下の通りであります:
class Solution {
public int trap(int[] height) {
//长度为小于2直接返回
if (height.length<=2)
return 0;
//来自题解的思路 按列求
//左边最高的墙
int leftHigh = 0;
//右边最高的墙
int rightHigh = 0;
//水容量
int waterSum = 0;
for (int i = 1; i<height.length-1; i++){
leftHigh = maxHigh(height,0,i);
rightHigh = maxHigh(height,i+1,height.length);
//能装多少水取决于最短的板 再减去底部
int temp = Math.min(leftHigh,rightHigh) - height[i];
if (temp>0){
waterSum += temp;
}
}
return waterSum;
}
//找出该区间最大的值
int maxHigh(int[] height, int left,int right){
int temp=0;
for (int i=left;i<right;i++){
if (temp<height[i]) temp=height[i];
}
return temp;
}
}