/** * CalculateWater 计算存水面积 * * 等宽柱体排列计算,柱体之间积水体积,如下图; * * @Date 2019/6/27 * @Author joker **/ public class CalculateWater { /** * 计算 - 优化:左右最高的查询可以依靠上一次查询,判断是否一致;判断其中一个比当前小就快速失败;超过中心点,少数优先判断; * * @param lens 若干顺序排列的高度 * @return */ public static int cal(int... lens) { int sum = 0; for (int index = 1; index < lens.length - 1; index++) { //左右两边最大的数字 int left = findMax(0, index-1, lens); int right = findMax(index+1, lens.length - 1, lens); int tmp = Math.min(left, right) - lens[index]; sum += tmp > 0 ? tmp : 0; } return sum; } private static int findMax(int start, int end, int[] array) { int max = array[start++]; for (; start <= end; ) { max = Math.max(max, array[start++]); } return max; } public static void main(String[] args) { int[] array = new int[]{5, 2, 3, 7, 8, 3, 6, 4}; System.out.println(cal(array)); } }