Redian新闻
>
谁有trapping rain water的code?
avatar
H*s
2
记得在哪里看过,只用从左到右扫描一遍,每次都把当前的bar向左所能trap的容量记
下。
关键是要用一个stack来记录已处理过的bars,没时间写代码了,你可以自己试着写。
avatar
w*o
3
这解法是O(n),空间是O(1):
大概的意思就是用左右两个指针,比较两个指针所指的值,从小的那个往中间移,移的
过程中要么增加maxL(或者maxR),要么tap water。直道两个指针相遇,其实两个相
遇在最大值。
if (bars == null || bars.length <= 2)
return 0;
int area = 0;
int l = 1, r = bars.length - 2;
int maxL = bars[0], maxR = bars[bars.length - 1];
while(l <= r)
{
if (maxL <= maxR)
{
if (bars[l] < maxL)
area += maxL - bars[l];
else
maxL = bars[l];
l++;
}
else
{
if (bars[r] < maxR)
area += maxR - bars[r];
else
maxR = bars[r];
r--;
}
}
return area;
avatar
M*e
4
thanks

【在 w***o 的大作中提到】
: 这解法是O(n),空间是O(1):
: 大概的意思就是用左右两个指针,比较两个指针所指的值,从小的那个往中间移,移的
: 过程中要么增加maxL(或者maxR),要么tap water。直道两个指针相遇,其实两个相
: 遇在最大值。
: if (bars == null || bars.length <= 2)
: return 0;
: int area = 0;
: int l = 1, r = bars.length - 2;
: int maxL = bars[0], maxR = bars[bars.length - 1];
: while(l <= r)

avatar
H*s
5
这个解法更简洁而且空间是O(1), wasco还是牛啊!

【在 w***o 的大作中提到】
: 这解法是O(n),空间是O(1):
: 大概的意思就是用左右两个指针,比较两个指针所指的值,从小的那个往中间移,移的
: 过程中要么增加maxL(或者maxR),要么tap water。直道两个指针相遇,其实两个相
: 遇在最大值。
: if (bars == null || bars.length <= 2)
: return 0;
: int area = 0;
: int l = 1, r = bars.length - 2;
: int maxL = bars[0], maxR = bars[bars.length - 1];
: while(l <= r)

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。