Redian新闻
>
议员没回复怎么办?
avatar
议员没回复怎么办?# EB23 - 劳工卡
m*1
1
这个题看了不少的讲解,大概就是维护一个栈,每当找到一个右边界时,弹出所有的左
边界进行计算,但是不明白为什么是O(n),因为我觉得有些元素会不止一次的做左边界
,leetcode上的一个测试例子是:
3,6,5,7,4,8,1,0
最大面积是4*5 = 20,但是当8作为右边界开始弹出时,6已经弹出,这样的话如何得到
左边界呢?
avatar
b*1
2
3/9 联系议员, 到今天也没回复。打到office问过, 确实收到我的fax。
要再打电话问吗?眼看就倒退了!悲催啊!
avatar
B*y
4
you got 2 senators and 1 congressman in your district, right?
avatar
s*s
5
我觉得就像http://www.informatik.uni-ulm.de/acm/Locals/2003/html/judge.html 里面说的,stack存的是started but yet unfinished subhistograms. 而且stack存的是高度的index,不是高度本身。你要是只存高度,那宽度的信息就丢失了。比如在你要得到4*5=20这个结果的时候,应该是iterate到了1,在将要弹出4的高度的时候,此时的stack应该是[3的index:0] -> [4的index:4]. 那rectangle的宽度是根据3的index0和1的index6来算的,就是6-0 - 1 = 5.
avatar
b*1
6
I contacted all of them and none responded so far.
Anything could I do?

【在 B*****y 的大作中提到】
: you got 2 senators and 1 congressman in your district, right?
avatar
l*b
7
终于会做了。。。
int largestRectArea(vector &h) {
stack p;
int i = 0, m = 0;
h.push_back(0);
while(i < h.size()) {
if(p.empty() || h[p.top()] <= h[i])
p.push(i++);
else {
int t = p.top();
p.pop();
m = max(m, h[t] * (p.empty() ? i : i - p.top() - 1 ));
}
}
return m;
}
avatar
B*y
8
call their offices
avatar
p*2
9

这个不错,过了OJ了?一会儿学习一下。

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
l*b
10
过了,哈哈

【在 p*****2 的大作中提到】
:
: 这个不错,过了OJ了?一会儿学习一下。

avatar
p*2
11

上来加个0有点tricky呀。如果给定是int[]就不能那么做了。

【在 l*******b 的大作中提到】
: 过了,哈哈
avatar
c*a
12

不用0和int[]的话,最后加上这些就可以啦
while(!stack.empty):
m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

【在 p*****2 的大作中提到】
:
: 上来加个0有点tricky呀。如果给定是int[]就不能那么做了。

avatar
l*b
13
嗯,对的,本来想着还得给while里加好几句,所以才给h里push了个0,强制把stack都
弹出来

【在 c*****a 的大作中提到】
:
: 不用0和int[]的话,最后加上这些就可以啦
: while(!stack.empty):
: m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

avatar
p*2
14

我的意思是这个trick挺好,但是面试的时候很可能用不上。

【在 c*****a 的大作中提到】
:
: 不用0和int[]的话,最后加上这些就可以啦
: while(!stack.empty):
: m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

avatar
p*2
15
不过我觉得这题是我做的所有面试题里差不多最难的。自己根本不可能想出来。
avatar
d*9
16
这个和那个山上存雨水的问题有共通之处吧?
avatar
k*r
17
lz,测8的时候,4就已经是他的左边界了。

【在 m*******1 的大作中提到】
: 这个题看了不少的讲解,大概就是维护一个栈,每当找到一个右边界时,弹出所有的左
: 边界进行计算,但是不明白为什么是O(n),因为我觉得有些元素会不止一次的做左边界
: ,leetcode上的一个测试例子是:
: 3,6,5,7,4,8,1,0
: 最大面积是4*5 = 20,但是当8作为右边界开始弹出时,6已经弹出,这样的话如何得到
: 左边界呢?

avatar
k*r
18
那个能装多少水的那个,我脚的比这个还难呢

【在 p*****2 的大作中提到】
: 不过我觉得这题是我做的所有面试题里差不多最难的。自己根本不可能想出来。
avatar
b*n
19
这个真是太简洁了。
今天晚上从有思路到AC,吭哧吭哧花了40分钟,一看二爷给了5分的难度,还挺高兴的
。到这儿一看“菜鸟”的code,才是我的1/3,膜拜。 orz

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
p*2
20

装水那个我挺快想出来了。这个没想出来当时。

【在 k****r 的大作中提到】
: 那个能装多少水的那个,我脚的比这个还难呢
avatar
b*n
21
装水那个我差了一口气,我左右两个index同时移动了。

【在 p*****2 的大作中提到】
:
: 装水那个我挺快想出来了。这个没想出来当时。

avatar
w*x
22

//a binary search solution
int GetBiggestRectBin(int a[], int n)
{
if (n <= 0) return 0;
assert(a);
int nMinIndex = 0;
for (int i = 1; i < n; i++)
if (a[nMinIndex] > a[i])
nMinIndex = i;

int nCur = a[nMinIndex] * n;
int nLft = GetBiggestRectBin(a, nMinIndex);
int nRgt = GetBiggestRectBin(a + nMinIndex + 1, n - 1 -nMinIndex);
return max(nCur, max(nLft, nRgt));
}

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
p*2
23

这个我当时想到了。不过复杂度高了些。

【在 w****x 的大作中提到】
:
: //a binary search solution
: int GetBiggestRectBin(int a[], int n)
: {
: if (n <= 0) return 0;
: assert(a);
: int nMinIndex = 0;
: for (int i = 1; i < n; i++)
: if (a[nMinIndex] > a[i])
: nMinIndex = i;

avatar
w*x
24

我觉得这题真要问的话给个二分就差不多了,又好写。
基本上写堆栈的感觉肯定是见过了

【在 p*****2 的大作中提到】
:
: 这个我当时想到了。不过复杂度高了些。

avatar
p*2
25
我也这么认为

【在 w****x 的大作中提到】
:
: 我觉得这题真要问的话给个二分就差不多了,又好写。
: 基本上写堆栈的感觉肯定是见过了

avatar
c*t
26
这道题我想到的是二分法
存水题也很难想,我试图用两边夹,还是没想出,最后想了一个先找出最大数,然后左
右算分别存水量。

【在 b*****n 的大作中提到】
: 装水那个我差了一口气,我左右两个index同时移动了。
avatar
w*x
27

其实这题的O(n)解法和那个移动窗口和直方图蓄水问题很类似,都是保证一个递增或递
减序列然后通过index判断距离。

【在 c********t 的大作中提到】
: 这道题我想到的是二分法
: 存水题也很难想,我试图用两边夹,还是没想出,最后想了一个先找出最大数,然后左
: 右算分别存水量。

avatar
c*t
28
嗯,我再复习一下体会体会

【在 w****x 的大作中提到】
:
: 其实这题的O(n)解法和那个移动窗口和直方图蓄水问题很类似,都是保证一个递增或递
: 减序列然后通过index判断距离。

avatar
m*1
29
这个题看了不少的讲解,大概就是维护一个栈,每当找到一个右边界时,弹出所有的左
边界进行计算,但是不明白为什么是O(n),因为我觉得有些元素会不止一次的做左边界
,leetcode上的一个测试例子是:
3,6,5,7,4,8,1,0
最大面积是4*5 = 20,但是当8作为右边界开始弹出时,6已经弹出,这样的话如何得到
左边界呢?
avatar
s*s
30
我觉得就像http://www.informatik.uni-ulm.de/acm/Locals/2003/html/judge.html 里面说的,stack存的是started but yet unfinished subhistograms. 而且stack存的是高度的index,不是高度本身。你要是只存高度,那宽度的信息就丢失了。比如在你要得到4*5=20这个结果的时候,应该是iterate到了1,在将要弹出4的高度的时候,此时的stack应该是[3的index:0] -> [4的index:4]. 那rectangle的宽度是根据3的index0和1的index6来算的,就是6-0 - 1 = 5.
avatar
l*b
31
终于会做了。。。
int largestRectArea(vector &h) {
stack p;
int i = 0, m = 0;
h.push_back(0);
while(i < h.size()) {
if(p.empty() || h[p.top()] <= h[i])
p.push(i++);
else {
int t = p.top();
p.pop();
m = max(m, h[t] * (p.empty() ? i : i - p.top() - 1 ));
}
}
return m;
}
avatar
p*2
32

这个不错,过了OJ了?一会儿学习一下。

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
l*b
33
过了,哈哈

【在 p*****2 的大作中提到】
:
: 这个不错,过了OJ了?一会儿学习一下。

avatar
p*2
34

上来加个0有点tricky呀。如果给定是int[]就不能那么做了。

【在 l*******b 的大作中提到】
: 过了,哈哈
avatar
c*a
35

不用0和int[]的话,最后加上这些就可以啦
while(!stack.empty):
m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

【在 p*****2 的大作中提到】
:
: 上来加个0有点tricky呀。如果给定是int[]就不能那么做了。

avatar
l*b
36
嗯,对的,本来想着还得给while里加好几句,所以才给h里push了个0,强制把stack都
弹出来

【在 c*****a 的大作中提到】
:
: 不用0和int[]的话,最后加上这些就可以啦
: while(!stack.empty):
: m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

avatar
p*2
37

我的意思是这个trick挺好,但是面试的时候很可能用不上。

【在 c*****a 的大作中提到】
:
: 不用0和int[]的话,最后加上这些就可以啦
: while(!stack.empty):
: m = max(m,h[stack.pop]* (stack.empty() ? i : i-stack.peek()-1))

avatar
p*2
38
不过我觉得这题是我做的所有面试题里差不多最难的。自己根本不可能想出来。
avatar
d*9
39
这个和那个山上存雨水的问题有共通之处吧?
avatar
k*r
40
lz,测8的时候,4就已经是他的左边界了。

【在 m*******1 的大作中提到】
: 这个题看了不少的讲解,大概就是维护一个栈,每当找到一个右边界时,弹出所有的左
: 边界进行计算,但是不明白为什么是O(n),因为我觉得有些元素会不止一次的做左边界
: ,leetcode上的一个测试例子是:
: 3,6,5,7,4,8,1,0
: 最大面积是4*5 = 20,但是当8作为右边界开始弹出时,6已经弹出,这样的话如何得到
: 左边界呢?

avatar
k*r
41
那个能装多少水的那个,我脚的比这个还难呢

【在 p*****2 的大作中提到】
: 不过我觉得这题是我做的所有面试题里差不多最难的。自己根本不可能想出来。
avatar
b*n
42
这个真是太简洁了。
今天晚上从有思路到AC,吭哧吭哧花了40分钟,一看二爷给了5分的难度,还挺高兴的
。到这儿一看“菜鸟”的code,才是我的1/3,膜拜。 orz

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
p*2
43

装水那个我挺快想出来了。这个没想出来当时。

【在 k****r 的大作中提到】
: 那个能装多少水的那个,我脚的比这个还难呢
avatar
b*n
44
装水那个我差了一口气,我左右两个index同时移动了。

【在 p*****2 的大作中提到】
:
: 装水那个我挺快想出来了。这个没想出来当时。

avatar
w*x
45

//a binary search solution
int GetBiggestRectBin(int a[], int n)
{
if (n <= 0) return 0;
assert(a);
int nMinIndex = 0;
for (int i = 1; i < n; i++)
if (a[nMinIndex] > a[i])
nMinIndex = i;

int nCur = a[nMinIndex] * n;
int nLft = GetBiggestRectBin(a, nMinIndex);
int nRgt = GetBiggestRectBin(a + nMinIndex + 1, n - 1 -nMinIndex);
return max(nCur, max(nLft, nRgt));
}

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

avatar
p*2
46

这个我当时想到了。不过复杂度高了些。

【在 w****x 的大作中提到】
:
: //a binary search solution
: int GetBiggestRectBin(int a[], int n)
: {
: if (n <= 0) return 0;
: assert(a);
: int nMinIndex = 0;
: for (int i = 1; i < n; i++)
: if (a[nMinIndex] > a[i])
: nMinIndex = i;

avatar
w*x
47

我觉得这题真要问的话给个二分就差不多了,又好写。
基本上写堆栈的感觉肯定是见过了

【在 p*****2 的大作中提到】
:
: 这个我当时想到了。不过复杂度高了些。

avatar
p*2
48
我也这么认为

【在 w****x 的大作中提到】
:
: 我觉得这题真要问的话给个二分就差不多了,又好写。
: 基本上写堆栈的感觉肯定是见过了

avatar
c*t
49
这道题我想到的是二分法
存水题也很难想,我试图用两边夹,还是没想出,最后想了一个先找出最大数,然后左
右算分别存水量。

【在 b*****n 的大作中提到】
: 装水那个我差了一口气,我左右两个index同时移动了。
avatar
w*x
50

其实这题的O(n)解法和那个移动窗口和直方图蓄水问题很类似,都是保证一个递增或递
减序列然后通过index判断距离。

【在 c********t 的大作中提到】
: 这道题我想到的是二分法
: 存水题也很难想,我试图用两边夹,还是没想出,最后想了一个先找出最大数,然后左
: 右算分别存水量。

avatar
c*t
51
嗯,我再复习一下体会体会

【在 w****x 的大作中提到】
:
: 其实这题的O(n)解法和那个移动窗口和直方图蓄水问题很类似,都是保证一个递增或递
: 减序列然后通过index判断距离。

avatar
s*n
52
挖个旧坑再问这道题
对于每个i,如果进到else{}中,为什么只要求和上一个top之间的面积?为什么不能
是和top下面的height形成的矩形面积更大?

【在 l*******b 的大作中提到】
: 终于会做了。。。
: int largestRectArea(vector &h) {
: stack p;
: int i = 0, m = 0;
: h.push_back(0);
: while(i < h.size()) {
: if(p.empty() || h[p.top()] <= h[i])
: p.push(i++);
: else {
: int t = p.top();

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