- 总结LintCode上两类看起来类似的问题
- 装水问题
- 接水问题
LintCode-383.装最多水的容器
给定 n 个非负整数 a1, a2, …, an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。注意:容器不可倾斜。
- 暴力遍历
- 每条线和之前所有线计算
- 记录最大值
- 时间复杂度:O(n^2)
- 示例解法
- 两个指针分别从数组两端开始向中间遍历(分别找到高度不为零的竖边)
- 每次计算面积,并记录最大值
- 将较低高度的指针移动一位
- 遍历整个数组
- 时间复杂度:O(n)
- 就示例解法me的思考
从两端逼近,容器X轴边长单调减小,要使面积增大的话,必须增大宽,所以保留长的竖边
1 | // 示例AC代码 |
LintCode-363.接雨水 系列一
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
- 注意:此时竖边是有宽度的。
此题本质:某一bar的接水量=min(左边bar最大高度,右边bar最大高度)-bar高
- 最直接的做法
- 双数组,一个储存左边bar最大高度,一个储存右边bar最大高度
- 有点绕的最优解
- 两个记录最大高度的数组,自最大值出现后就不会被调用了(因为取得是min值)
- 采用对撞型指针,每次让高度较小的指针移动即可
- 该指针处接水量即为该方向最大值减去该处bar高
- 循环直至两指针相遇于最高处
1 | public int trapRainWater(int[] heights) { |
LintCode-364.接雨水 系列二
Given n x m non-negative integers representing an elevation map 2d where the area of each cell is 1 x 1, compute how much water it is able to trap after raining.
- emmm 此题感觉难度过大。暂不研究