leetcode:42.接雨水 蔚落 2022-04-13 10:10 174阅读 0赞 ## 题目: ## 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 ![在这里插入图片描述][20181129013541743.png] 上面是由数组 \[0,1,0,2,1,0,1,3,2,1,2,1\] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: \[0,1,0,2,1,0,1,3,2,1,2,1\] 输出: 6 ## 分析: ## 难点在于每个点的盛水需要确定左右的最高点,于是先找到所有柱子中最高的一根,再对左右进行分治,这样只需要考虑一边已知的最高点即可 ## 代码: ## public int trap(int[] height) { int l = height.length; // 找出最高点坐标 int maxHeightIndex = 0; for (int i = 0; i < l; i++) { if (height[i] > height[maxHeightIndex]) maxHeightIndex = i; } int res = 0; // 分析左半区域 int leftHeightMax = 0; for (int i = 0; i < maxHeightIndex; i++) { leftHeightMax = Math.max(leftHeightMax, height[i]); res += leftHeightMax - height[i] > 0 ? leftHeightMax - height[i] : 0; } // 分析右半区域 int rightHeightMax = 0; for (int i = l - 1; i > maxHeightIndex; i--) { rightHeightMax = Math.max(rightHeightMax, height[i]); res += rightHeightMax - height[i] > 0 ? rightHeightMax - height[i] : 0; } return res; } ## 效率: ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0NTE2NTQ5_size_16_color_FFFFFF_t_70] ## 总结: ## 在面对复杂的问题时可以使用先确定一个条件,再分治的方法解决 [20181129013541743.png]: /images/20220413/674ad9bcfc294885b14ece438d8f735d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0NTE2NTQ5_size_16_color_FFFFFF_t_70]: /images/20220413/a30264e750e44fef898460ed4766d032.png
还没有评论,来说两句吧...