Leetcode -42.接雨水

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44116998/article/details/102089077

题目描述 题目来源:力扣(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;
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/102089077