JVAV学习小练习(一)之leetcode习题之接雨水

25 篇文章 1 订阅
13 篇文章 1 订阅

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;
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值