算法:接雨水
题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6

此题初看很困难,但是理解了解题思路之后,代码逻辑比较简单,重点是找到怎样加水的规律。
解题方法:双指针和动态规划
思路梳理:
-
使用双指针,左指针和右指针初始值为数组起始和末尾。
-
用双指针遍历数组(循环条件为左指针小于右指针),直到两指针相遇。
-
每次比较左右元素大小,去低的一侧加水,然后移动该侧的指针。
-
加水的原则是该侧具有高度差(加水量是此元素与此侧最高值的高度差)
我的 Java 代码:
public int trap(int[] height) {
int left = 0;
int right = height.length-1;;
int lmax = 0;
int rmax = 0;
int water = 0; // 总水量
// 用双指针遍历数组,每次只移动一个指针
while(left<right)
{
// 当左指针元素小于右指针元素,去左侧加水
if(height[left]<height[right])
{
//更新左侧最高值
lmax = Math.max(height[left],lmax);
//更新总水量=上次总水量+加水量
water + = lmax-height[left];
//左指针往右移
left++;
}
// 当右指针的元素小于左指针,则去右侧加水。目的为了使指针遍历完数组。
else
{
rmax = Math.max(height[right],rmax);
water += rmax-height[right];
right--;
}
}
return water;
}
所有正文内容皆为本人原创,禁止搬运

浙公网安备 33010602011771号