版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述 题目来源:力扣(LeetCode)包括涉及的图片
定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路分析
这好像是一道水题,放在Leetcode中属于难度困难级别,而且用栈,但是我觉得啥都不用好像就能解决掉这个问题。
我的思路是:分析图片,按常理来说,我们首先会排除边缘为零的柱子,因为根本不起作用,我就采用for(int i = 0;i < n ;i++)//输入每个柱子的高度 { cin>>temp; if (temp != 0) flag = 1; if (flag == 1) height[cunt++] = temp; }
这种读取,设置一个标志,从一开始遇见非零的数开始存入,并且cunt计数;然后呢,在计算可容纳的水柱高度的时候,我采取将int difference = height[v] - height[w];
这个差值只要一直大于零,先用一个临时变量temp存着,直到以height [ v ]为开端的差值小于等于零,才会把temp累加到sum,因为这个很好理解,如果左边的高度一直大于右边的高度,肯定就不能使用左边这个高度作为边界来计算水量,那么 v就直接v++即可。若temp累加到sum,就把左边的水柱记号 v 移到w处,进行下一次计算即可。
代码实现
#include<iostream>
using namespace std;
#define Maxsize 1000
int cunt = 0;
int Function(int *,int );
int main()
{
int n,flag = 0,temp = 0;
int height[Maxsize];
cout<<"请输入柱子数量" <<endl;
cin >> n;//输入柱子数量
cout<<"请输入每个柱子的高度"<<endl;
for(int i = 0;i < n ;i++)//输入每个柱子的高度
{
cin>>temp;
if (temp != 0)
flag = 1;
if (flag == 1)
height[cunt++] = temp;
}
cout << "容量最大值为"<<Function(height, 0) << endl;
return 0;
}
int Function(int height[],int i)
{
int v = 0,w = 0,sum = 0;
while( v < cunt )
{
int temp = 0,flag = 0;
for(w = v + 1;w < cunt;w++)
{
int difference = height[v] - height[w];
if ( difference > 0)
temp += difference;
if (difference <= 0)
{
flag = 1;
sum += temp;
v = w;
break;
}
}
if(flag == 0)
v++;
}
return sum;
}
运行结果