有一组不同高度的台阶,有一个整数数组表示,数组中每个数是台阶的高度。

如题

有一组不同高度的台阶,有一个整数数组表示,数组中每个数是台阶的高度。当开始下雨了(雨水足够多)台阶之间的水坑会积水多少呢?如下图,可以表示为数组[0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]

在这里插入图片描述
积水情况为:
在这里插入图片描述
然后,整代码:

class Test {
    static int[] a = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
    //    static int[] a = {1, 0, 2, 0, 1, 2};
    static int n = a.length;
    static int z = 0;

    public static void main(String[] args) {
        int l = -1;
        int r = -1;
        for (int i = 0; i < n; i++) {
            if (a[i] == 0) {
                continue;
            }
            l = r < i ? i : r;//判断是使用新的i作为左边界还是上次的右边作为左边界
            r = interval(l);//给出左边界获取右边界
            System.out.println("获取右边界:" + r);
            if (r == l) {
                continue;
            }
            i = r - 1;
            int c = r - l - 1;//区间长度
            System.out.println("区间长度:" + c);
            //区间内台阶大小
            int m = 0;
            for (int j = l + 1; j < r; j++) {
                m += a[j];
            }
            System.out.println("区间内部台阶大小:" + m);
            //区间内部存水量
            int g = (a[l] > a[r] ? a[r] : a[l]) * c - m;
            System.out.println("区间" + l + "~" + r + "容量:" + g + "\n");
            z += g;
        }
        System.out.println(z);
    }


    //求出右边界
    static int interval(int l) {
        System.out.println("左边界;" + l);
        int r = l;
        int lborder = a[l];//左边界高度
        int rborder = 0;//右边界高度
        for (int j = l + 1; j < n; j++) {
            // 台阶开始下降直接返回
            if (a[j] < rborder) {
                break;
            }
            // 找出右边界
            if (a[j] >= lborder) {
                rborder = a[j];
                r = j;
            }
        }
        return r;
    }
}

大致思路就是求出能够存水的左右两边边界,然后计算边界内部的存水量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值