LeetCode 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;
	}
};
结果:




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值