如题
有一组不同高度的台阶,有一个整数数组表示,数组中每个数是台阶的高度。当开始下雨了(雨水足够多)台阶之间的水坑会积水多少呢?如下图,可以表示为数组[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;
}
}
大致思路就是求出能够存水的左右两边边界,然后计算边界内部的存水量。