[15725]接雨水题解

题目描述

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

注: 上面蓝色部分面积是样例1中能够接到雨水的部分。

输入格式

第一行是一个正整数n,n表示柱子的数量。

第二行有n用空格隔开的正整数,第height[i]个数字表示第i个柱子的高度。

输出格式

输出一个整数

样例 #1

样例输入 #1

12
0 1 0 2 1 0 1 3 2 1 2 1

样例输出 #1

6

样例 #2

样例输入 #2

6
4 2 0 3 2 5

样例输出 #2

9

提示

1<=n<=2∗10^4
0<=height[i]<=1*10^5

题目思路

该题的想法是枚举每一个柱子的上方能接多少水,由于每一个柱子都会枚举到所以并不用考虑周围。
至于求上方能接多少水的方法,我们使用前缀和后缀数组来快速求解。
那么本题就非常简单了。

核心代码

求前缀和后缀数组部分

vector<int> prefixMax(const vector<int>& arr) 
{
	vector<int> prefix(arr.size());
	prefix[0]=arr[0];
	for(int i=1;i<arr.size();i++){
		prefix[i]=max(prefix[i-1],arr[i]);
	}
	return prefix;
}
vector<int> suffixMax(const vector<int>& arr) 
{
	vector<int> suffix(arr.size());
	suffix[arr.size()-1]=arr[arr.size()-1];
	for(int i=arr.size()-2; i>=0;i--){
		suffix[i]=max(suffix[i+1],arr[i]);
	}
	return suffix;
}

枚举部分

    for(int i=0;i<n;i++)
	{
		int min_=min(prefix[i],suffix[i]);
		ret+=min_-arr[i];
	}
4 个赞

大佬膜拜%%%

1 个赞

大佬膜拜%%%.

1 个赞

大佬膜拜%%%

666,不是啊?

1 个赞