给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例:
输入:height = [4,2,0,3,2,5] 输出:9
目录
思路一:找最高峰,算出左右两边的水量之和
int trap(int* height, int heightSize){
int i = 0;
int max_index = 0, max = 0;
int water_lvl = 0;
int ans = 0;
for ( i = 0; i < heightSize; i++)
{
if(height[i] > max)
{
max_index = i;
max = height[i];
}
}
water_lvl = 0;
for ( i = 0; i < max_index; i++)
{
if(height[i] > water_lvl)
{
water_lvl = height[i];
}
ans += water_lvl - height[i];
}
water_lvl = 0;
for(i = heightSize - 1; i > max_index ; i--)
{
if(height[i] > water_lvl)
{
water_lvl = height[i];
}
ans += water_lvl - height[i];
}
return ans;
}
时间复杂度O(n),空间复杂度O(1)
分析:
本题想到先找到最高峰,由于水量需要两个高度相近的柱子来存放,从两边由小到大的柱子高度递增将水量累加起来。水量等于低柱子的高度减去该位置柱子高度,若该位置柱子高度高于原低柱子,则将柱子高度换为该位置柱子高度。两边相加输出结果
总结:
该题主要考察了对实际问题的应用,本质上还是对数组的灵活应用。