leetcode习题之接雨水
一、题目描述
给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。(图片是从leetcode拉过来的)
二、解题思路:
1)将三维图形平面化,分层而治,即每一层中看成有或无立体块,即0或1;
分别遍历每一层,判断每个立体块周围有无其他立体块或能否形成封闭区间,当某一位置为0(即无立体块)时且其四周(大于0的距离d处)存在非0状态时,此区域可存放的d1+d2+d3+d4个雨滴。
2)分解后对每一层分析如下:
三、运行结果
三、粗略的代码如下
希望能够一个好的算法,,,,,,
//
// 示例:
//
// 给出如下 3x6 的高度图:
// [
// [1,4,3,1,3,2],
// [3,2,1,3,2,4],
// [2,3,3,2,3,1]
// ]
public class water {
public static void main(String[] args) {
int rain[][]={{1,4,3,1,3,2},{3,2,1,3,2,4},{2,3,3,2,3,1}};
System.out.println("下雨后,雨水将会被存储在这些方块中。总的接雨水量是:"+sum(rain));
}
public static int sum(int item[][]){
int sum=0;
int max=0;//记录方块组的最高高度
System.out.println("#方块组高度矩阵为:");
for (int temp[]:item){
for (int temp1:temp){
if(max<=temp1) max=temp1;
System.out.print(temp1+" ");
}
System.out.println();
}
int [][][]water=new int[max-1][3][6];
for(int i=0;i<max-1;i++){
for (int j=0;j<3;j++){
for (int k=0;k<6;k++)
if(item[j][k]>=max-i) water[i][j][k]=1;
}
sum+=getNum(water[i]);
}
return sum;
}
public static int getNum(int nums[][]){
int sum=0;
boolean flage=true;
for (int i=0;i<nums[0].length;i++){
sum+=(nums[1][i]!=1&&nums[0][i]==1&&nums[2][i]==1) ? 1 : 0;
flage=(nums[1][i]==1&&i>0)?false:falge;
}
return flage?0:sum;
}
}