H*s
2 楼
记得在哪里看过,只用从左到右扫描一遍,每次都把当前的bar向左所能trap的容量记
下。
关键是要用一个stack来记录已处理过的bars,没时间写代码了,你可以自己试着写。
下。
关键是要用一个stack来记录已处理过的bars,没时间写代码了,你可以自己试着写。
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;
大概的意思就是用左右两个指针,比较两个指针所指的值,从小的那个往中间移,移的
过程中要么增加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;
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)
【在 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)
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)
【在 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)
相关阅读
出一道我发明的题,难度算简单吧。经验之谈,去朋友的公司挺不好Job Openings in Chicago for Financial/Trading Company Java刚才无意看到F家点进去就被删掉了请教各位牛人一个的问题越是年轻人,就越是个性鲜明感觉台湾人民的薪资和发展跟大陆没区别啊!一个朋友刚去狗狗上个星期二去面的有人有G家 design 题的收集吗?三月份入职Apple, 今年底会给RSU refresh吗?刚刚升为director的前工程师电面我,该怎么准备?已经是Scientist(公司)的level...最近发现和新员工很不对付indeed越来越烂了组里人手紧张,要招Rails有人知道sumo logic这家公司么?说起来加班这件事Re: counter offer问题这个问题几乎每次面试都会问