这个题是给出一个数组,求该数组元素所构成图形能装水的量,如上所示图形给出了一个示例,这个题是一道很复杂的题,这种题型必须得在纸上画一画可能出现的情况,否则真的很难得出正确答案的。我的思路是去找低谷,有低谷一定可以构成”容器“,需要注意的细节如下:
1. 首先找到低谷,找连续递减的序列的最后位置,找到该位置了,再去找递增的序列,找到顶部,为了方便说明我画图分析一些容易出错的地方吧。
从图中的分析可以看出,我们在找高位置的时候需要注意,这是个最容易出错的点,下面就看看代码吧:
class Solution { public: int trap(vector<int>& height) { /* 这个题又是个数字游戏题,我做完了后发现它充满着陷阱,很难一次想到所有情况,调试了很多次才写好的,不过庆幸的是,这个题的问题很容易发现,我建议在动手之前请多画图,多联系生活列出一些特殊情况里帮助分析。 */ int area = 0; int len = height.size(); int begin = 0; int end = 0; while (begin < len) { end = begin; //找最低谷 while (end < len-1 && height[end] > height[end + 1] && height[begin]>0) { ++end; } if (end == begin) {//没找到 ++begin; continue; } //找比构成面积的连续最高位置 int newbegin = end; while (end + 1 < len && height[end] <= height[end+1]) { ++end; } if (end == newbegin) { begin = end+1; continue; } //可能存在更高的位置,需要去找找看 if(height[begin] > height[end]) { //还需要找最高位置 int nbegin = end; int nend = end; int maxheigh = height[end]; //记录最高位置 while (nend < len) { if (height[nend] > maxheigh) { end = nend; maxheigh = height[nend]; if (maxheigh > height[begin]) {//找到了高于height[begin]的位置就可以跳出循环了,因为此时已经是能够构成的最大容器了 break; } } ++nend; } } //选择begin和end的较小者,用来计算容器 int h = min(height[begin], height[end]); for (size_t i = begin; i < end + 1; ++i) { int val = h - height[i]; if (val > 0) { area += val; } } begin = end; } return area; } };
结果:
时间: 2024-10-12 09:32:38