笔试题55. LeetCode OJ (42)
Posted _从未止步
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题55. LeetCode OJ (42)相关的知识,希望对你有一定的参考价值。
这个题是给出一个数组,求该数组元素所构成图形能装水的量,如上所示图形给出了一个示例,这个题是一道很复杂的题,这种题型必须得在纸上画一画可能出现的情况,否则真的很难得出正确答案的。我的思路是去找低谷,有低谷一定可以构成”容器“,需要注意的细节如下:
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;
}
};
结果:
以上是关于笔试题55. LeetCode OJ (42)的主要内容,如果未能解决你的问题,请参考以下文章