42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解题思路有两类,一类是计算每一个柱体承接的雨水然后想加,解法有双指针,数组(左右两侧最大高度);一类是计算一段区间水平方向的面积,解法有单调栈。
暴力解法每次都有遍历左右两边寻找最大值,所有时间复杂度是O(n^2)。
双指针时间复杂度和空间复杂度都最小,就是不好理解。
双指针思路: 设有两个变量left,right从左右两边开始遍历。高度更低的向里面缩,同时计算是不是低于它这一侧的最大值,若是计算接水量;若不是,更新它这一侧的最大值。当left,right相遇跳出循环。
双指针的思路是一个主体承接的雨水体积大小取决于它左右两侧最高柱体较低的那个柱体与自己的差。双指针从左右两侧向里面逼近,可以计算双指针高低较低的一侧的柱体,因为它的左右两侧最高柱体较低的那个柱体已经知道了,所以可以计算,计算之后移动指针,继续比较左右指针哪个高哪个低。
ldp[i]表示从0到i的最大值,rdp[i]表示从i到arr.length - 1的最大值。
当拿到左右两边的最大值,取两者中的最小值,若大于arr[i],计算接水量。
“数组保存左右两边最大值”解法比“双指针”更容易理解。
import java.util.*;
public class Solution {public long maxWater (int[] arr) {//为了防止求和超出Int最大值,使用long记录最有两边最大值。long[] ldp = new long[arr.length];long[] rdp = new long
本文发布于:2024-01-27 21:11:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063610982666.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |