个人思路为法一
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
int trap(int* height, int heightSize)
{ int total = 0;
short left = 0;
short right = heightSize - 1;
short tmph1 = 0;
short tmph2 = 0;
if (heightSize == 0)
{
return 0;
}
tmph1 = height[left];
tmph2 = height[right];
while (left < right)
{
if (tmph1 < tmph2)
{ left++;
tmph1 = tmph1 < height[left] ? height[left] : tmph1;
total += (tmph1 - height[left]); }
else { right--;
tmph2 = tmph2 < height[right] ? height[right] : tmph2;
total += (tmph2 - height[right]);
}
}
return total;
}
思路:先找到最高的位置,然后左右分别遍历天坑,求和减去原始柱子高度和
#define MAX(a, b) (a) > (b) ? (a) : (b)
#define MIN(a, b) (a) < (b) ? (a) : (b)
int trap(int* height, int heightSize)
{int i = 0;
int j = 0;
int total = 0;
int max_left = 0;
int max_right = 0;
//右边最大值坐标
int max_r_index = 0;
int temp = 0;
for (i = 1; i < heightSize - 1; i++)
{ //左边坐标不停右移,不需要循环遍历,比较最新的左边坐标和历史最高值即可
max_left = MAX(max_left, height[i - 1]);
//第一次进行遍历,以及右移之后,当最大值坐标超出最大值范围,再重新计算
if (max_right == 0 || i + 1 > max_r_index)
{ max_right = 0;
for (j = i + 1; j < heightSize; j++)
{
if (max_right <= height[j])
{
max_right = height[j];
max_r_index = j; }
}
}
temp = MIN(max_left, max_right);
if (temp >= height[i])
{ total += (temp - height[i]);
}
}
return total;
}
对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。