It's very hard to come up with the optimal algorithm when you hear this problem for the first time on your interview. People who are giving this question on the interview and expect to get an optimal solution, shouldn't be performing interviews at all.
6 seconds into video: "Wait am I watching a coding interview tutorial ?!?!" Data Structures and Algos are such complex and mind numbing topics. I love the fact that you added humor to such complicated topics. Its good to be laughing while learning. It just made learning a lot more enjoyable. SUBSCRIBED
Your solution is correct, but the magical change at 15:45 is suboptimal - it can lead to having multiple entries for the same height at the top of your stack. For example input [1,2,1] leads to having [0,1] and [1,1] in your stacks at the end of the for loop. A better solution would be to add "|| h > hStack[hStack.length - 1]" to the if statement you removed. Just wanted to chime in since I just went through all your Coding Interview Problem videos while preparing for my coding interview. They were a great resource, thanks for all the effort you put into those!
Was going to make a similar remark... In fact it looks like it would even potentially give wrong answers! Take [ 1, 2, 3, 2, 1 ]: the largest rectangle is 2x3 = 6, but with the given code, the two 2s would be counted as part of separate rectangles in the stack (of size 2x1 and 2x2), so the code would think the 1x5 rectangle is bigger. Eh. Or is it me who's missing something? :P
Ah no indeed, I'm the one who missed something: the size is calculated keeping the very last index accessed, so it will indeed see the correct rectangle... My bad!
@Sebastian: Wow.. I was thinking exactly the same thing.. and in fact, I corrected this part: repl.it/repls/WoefulFavorableCustomer And then I started looking for a comment, hoping that someone else (apart from me) would pointed out this.. and I found yours. Thanks for confirming that WE are right.
I have a question. This is obviously a coding interview problem, so you need to code the thing. But what if using stacks isn't the "obvious" method, and just talking your way through and using stacks is confusing to the interviewer? You'd obviously want your interviewer to agree that your code works right then and there. You're not really gonna debug it and test if it works. So you might want to draw those stack diagrams and the histogram. But should you be doing this? When you're coding, is it okay to draw pictures to visualize your thought? And also, rather, SHOULD you be visualizing your thoughts during a coding interview?
In the interviews I've done, candidates who could draw a coherent visual to help them make sense of the problem tended also to write better code and explain their code better. If you can draw a visual quickly that puts you and the interviewer on the same page, I think that's definitely to your advantage. However, it's a matter of timing. If you spend 10 minutes diagramming, you're probably taking too long. 2 or 3 minutes, tops. Then focus on the code. Also, you totally should be debugging and testing mentally once you finish the code. Good question.
The implementation fails for [2, 1, 5, 6, 4, 4, 3]. It does not check if the next height is equal after encountering a smaller height. For the sample, it returns 10 instead of 16.
Could you please explain the case when there is just 1 bar at position 0? I think the maxarea should be 1 but your code would return 0 since pos and tempPos would both be 0.
Just got a something new in an interview i haven't seen before. Find the amount of magic squares in a given rectangle 2d array. Took me a while to figure out the optimal way to do it
Well done and thank you Jackson. You made it so intuitive. Java version is here is for critic 🙂 public int findLargestRectangle(int[] heights) { if (heights.length == 0) return 0; int currentPosition = 0, tempPos = Integer.MIN_VALUE, maxArea = Integer.MIN_VALUE; Deque positionStack = new ArrayDeque(); Deque heightStack = new ArrayDeque(); for (currentPosition = 0; currentPosition < heights.length; currentPosition++) { int currentHeight = heights[currentPosition]; if (heightStack.isEmpty() || currentHeight > heightStack.peek()) { positionStack.push(currentPosition); heightStack.push(currentHeight); } else if (currentHeight < heightStack.peek()) { while (!heightStack.isEmpty() && currentHeight < heightStack.peek()) { tempPos = positionStack.pop(); maxArea = Math.max(heightStack.pop() * (currentPosition - tempPos), maxArea); } heightStack.push(currentHeight); positionStack.push(tempPos); } } while (!heightStack.isEmpty()) { tempPos = positionStack.pop(); maxArea = Math.max(heightStack.pop() * (currentPosition - tempPos), maxArea); } return maxArea; }
Really clear explanation with beautiful visuals (did you actually write in reverse???), I just find the bg music a bit distracting but other than that true awesome!
Hey this video rocks! I had been puzzling for a while on how to do this, and the best I could do while getting a correct answer was O(n^2) time complexity, which is garbo. Thanks for the great explanation!
Thanks for this. I love seeing a solution in JS. I managed to do this problem using a tortured DP-ish solution which kept track of rectangle areas and heights. Nice to know there's a sane solution.
In the first example (8:16) you are computing size as 1*(5-0), where 5 is out of range of histogram positions. In your implementation pos is always < hist.length. So my question is how would you obtain maxSize == 5, for the first example of histogram [1,3,2,1,2]?
So, this algorithm has two loops. One loop, which I think is the one you've pointed out, only goes from 0 to 4 for this input. And you're right, that loop wouldn't pick up the 1x5 rectangle. Luckily, there's also a second loop. During this loop the position is actually 5, because the final incrementation has happened and pos is now equal to the length of the histogram array (that is, it's 5). So, in this second loop, you're actually using the full width of the histogram in the subtraction part of the formula.
Regarding your brute force method, if I got you right then I think you're wrong: take the histogram [9,8]. Your brute force method will return 9 while the right answer is 16. You need to go both right and left (and not only right)
Hey, thanks for the video. I have a quick question if you don't mind. When you went from 3 to 2, you only popped the top value from the height stack (since the rectangle at index 2 started from index 1). However, when you go from 2 to 1, you pop from both stacks. Can you explain why? From my understanding, there is still a rectangle from index 1 to index 3 with height 1. So what I have in the Position and Height stack when i = 5 is: P - H 4 - 2 1 - 1 0 - 1 Thanks!
when you reached 2 at position 2 you poped 3(as it was bigger than 2)but then you pushed 2 to form a rect of 2*2. BUT when you reached 1 at position 3 you poped 2(as it was bigger than 1)but then you didn't pushed 1 to form rect of 1*3?? please explain..
The algorithm does exactly that if you follow it or run it, it pushes 1*3 when reaching position 3. He probably missed it when doing the explainations...
Hi Jackson, your two stack approach is much easier to compute area. When I first see this problem, I thought about stack and keep adding as long as me is larger than top of stack while content of stack is larger me, keep popping. But what I stuck was in your example, when index is 3 with values [1,3,2,1], I thought I have to compute all possible rectangles such that [1]=1, [2,1]=2, [3,2,1]=3, [1,3,2,1]=4, but no videos explain why I don't have to compute the rectangle between two indices [0, 3] and instead they just compute [1, 3] which means we always guarantee that area between indices [1, 3] always larger than indices [0, 3]. I don't understand how come area between [1, 3] always larger than [0, 3] ?
Xingzhe Xin lol because if he's facing the camera from the other side of the glass while writing with his right hand.... then the text would appear backwards. So he then flips the video (making it appear as though he's left handed) and then the text is in the correct direction again.
TaG, there are a million real-world algorithms where this might be useful. For instance, image processing. If you're trying to identify the dominant luminosity range of an image perhaps. In audio processing, you might use a similar approach to determine the primary frequency range in an audio sample. You might also use it in GPS-related calculations, looking for the period of movement within a range of time.
How has he created this visual? It looks like he's writing on a transparent glass and he's on the other side.. but then that'd mean he is writing in a mirrored manner. If he's writing on a mirror, then how is he behind the board?
Your step by step explanation is confusing. You explained that at i=2, we dont remove from the position stack because the square actually started at i=1 where height=3 was. But in your code, you are actually popping it out and pushing it back in.
Elegant solution to the problem, but what analysis did you do to come up with this solution or is it that it's a well known problem with an equally well known solution. My thinking is are people coming up with creative solutions to problems based on their own hard work and ingenuity or is it just an exercise in knowing classical problems.
I came up with this solution myself. It's on hackerrank in the stacks category, so you already get a hint that you should be using stacks. From there on you find out what you need to retain in order to find the largest area.
Fuuuuuucccckkkk, this is mindblowing explanation. Please make more videos like this. Also normally I watch videos at 1.5x this is the first video I watched at 0.75x
I'd be very interested in seeing a solution with non uniform class widths I imagine a similar approach but where the total width passed through would be stored rather than the starting location. If given the question from the video in an interview. Would the interviewer prefer I simplify the problem and assume unity or that I handled for other cases?
Jackson Gabbard, I can't seem to follow how you got the starting position for the 3rd bar with height 2, for example if you took away the first bar and you just have an array of histogram heights of 3,2,1 how would you know that starting point of say height 2 or height 1. I think you need to hold these values. I would create a hash map which has height as the key and increment it each of the key by one if it qualifies/valid or pop it and compare it to the max value. A good test case to consider is 3,3,3,2,1,2,4,4,3,3,2,0,3,3,3,2,2,1,1,1,1,1
What happens if you replace the tempPos logic with pstack[-1]+1 when stack is not empty and let it be zero when stack is empty? Basically I am thinking the tempPos logic may be redundant. Am I wrong? In what cases does this not work if it doesn't?
Great video performance! But from the algorithmic point of view I would suggested this (in pseudo code) maxArea = 0 for all l:listOfConnectedRectangles in listOfListOfConnectedRectangles do currentArea = width(l) * min(height of rectangles in l) maxArea = max( maxArea, currentArea ) end And ah well, yes, I would also need to specify how to derive listOfListOfConnectedRectangles. :) Anyway, this is a suggestion from the top of my hat, what do you think?
In your code the min(height of rectangles in l) will give an incorrect result, as the best area of listOfConnectedRectangles is not the lowestHeight(l)*width(l). E.g. in case of l = [1, 2, 4, 5], the currentArea should 4 * 2 = 8 instead of 1 * 4 = 4
Doesn't it depend on how Eduard defines 'listOfConnectedRectangles' and 'height of rectangles in l'? I think he rather meant something like (given your example input): "take the rectangle of width 4 (starting at 1); its height is 1 (the min value), so its area is 4; now take the next rectangle, of width 3; the min is now 2, so the size is 6; etc. etc." In this case it would be correct. The problem is it is very far from optimal: it is just the 'brute force' approach Jackson talks about at the beginning of the video (2:12). Since you potentially loop over all the columns for each and every column, it takes O(N^2), while the stack-based solution presented here is O(N)...
2×2 is not a rectangle, its a square assuming that the length between each height is the same. so if the 2×2 happened to be saved as the largest, it would be the wrong answer. there would need to be a code somewhere that ignores the 2×2 because the length and width are the same.
Chandan Yadav disappointingly, you are right. 1 more common sense rule for a rectangle would eliminate this phenomenon. That rule being: "That parallel sides must be equal,but not equal to the adjacent parallels side." I call this new definition a "rectale". That way a square can never be a rectangle again.😂
Yeah, I meant that under the Rectale rule. A square isn't a Rectale but a square is a rectangle. But hopefully we would never use rectangle again. I guess we should stick with rectangle since we don't have the social or political power to indoctrinate the country into accepting and practicing the "Rectale" shape/rule.😂 If I had 20 seconds to stop a nuclear launch from destroying the world and I told my assistant "hurry, bring me the rectangle key". He could by definition bring me the square key when I needed the other. All of Human advancement could be destroyed over a weird rule that doesn't fully separate these 2 shapes. life is funny😂
Yeah. But you are not a world saving Terminator hero who doesn't know maths. You are a programmer who should know that when you are asked for a rectangle, you must include squares too. If you still insist on saving the world in your movie using the rectangle key, make sure that it is directed by Nolan so that he can take care of the technical things accurately and have the option between rectangle and circle and not rectangle and square! :P It is not a weird rule that separates these shapes. It's just how these are defined. A square is a rectangle, a rectangle is a polygon, a circle is an ellipse... A programmer should know that.
Can't we just add a 0 at the end of the histogram array? So we would have a bar of height 0, but that last step where you have to take into consideration the 0 - 1 stacks, you would get 0 so less than 1, you pop 1 and the new area becomes 1*(5-0) = 5(according to the formula)? Just asking, I am not that good when it comes to algorithms.
Here’s another approach (literally: bottom up rather than left to right). In pseudo code. DEFINE FUNCTION maxSize(INT start, INT stop) RETURNS INT LOCAL INT i IF start
1) I think you are missing to mention the time & space complexity. Is this the efficient solution ? Kind of like build towards the efficient one, from brute force. 2) Naming the position stack as starting position stack would have saved me some confusion :P
This algorithm is clearly O(n). You can only ever add something to the stack once and pop it off once. Stack operations are O(1), so linear on size of input histogram.
Is it weird that I know who you are because you use the same picture on Codeforces as you do here on UA-cam? Pixar I believe. Cool to randomly come across another coder like this!
You didn't explain why when 3 was poped, you kept its index, but when 2 is poped, you pop the index. The presentation is good but you missed the crucial part of this problem which was when to pop the index stack.
I think this is a good algo. But a hard interview question because I think the probability of coming up with this O(n) solution in the middle of an interview having never seen this problem is low.
This case is covered in the code. Try this example with histogram height value [1, 2, 3, 2, 1]. The code will find the correct rectangle area which is 2 * 3 = 6.
It's very hard to come up with the optimal algorithm when you hear this problem for the first time on your interview. People who are giving this question on the interview and expect to get an optimal solution, shouldn't be performing interviews at all.
DID ANYONE ELSE NOTICE THE INDIVIDUAL CHARACTERS FALLING DOWN FROM THE BOARD AFTER HE SPRAYED IT AT THE END??? 15:52
I was amazed for the longest time on how you write so well mirror until I figured you most likely are not left handed. Really clever presentation!
i need a t-shirt that says "function popThatShit(){}"
6 seconds into video: "Wait am I watching a coding interview tutorial ?!?!"
Data Structures and Algos are such complex and mind numbing topics.
I love the fact that you added humor to such complicated topics. Its good to be laughing while learning. It just made learning a lot more enjoyable.
SUBSCRIBED
"Uncut Jackson... unrelated to my parents decision"... SO subtle but i had to listen again to see if that was what I thought it was
Your solution is correct, but the magical change at 15:45 is suboptimal - it can lead to having multiple entries for the same height at the top of your stack. For example input [1,2,1] leads to having [0,1] and [1,1] in your stacks at the end of the for loop. A better solution would be to add "|| h > hStack[hStack.length - 1]" to the if statement you removed.
Just wanted to chime in since I just went through all your Coding Interview Problem videos while preparing for my coding interview. They were a great resource, thanks for all the effort you put into those!
Was going to make a similar remark...
In fact it looks like it would even potentially give wrong answers!
Take [ 1, 2, 3, 2, 1 ]: the largest rectangle is 2x3 = 6, but with the given code, the two 2s would be counted as part of separate rectangles in the stack (of size 2x1 and 2x2), so the code would think the 1x5 rectangle is bigger. Eh.
Or is it me who's missing something? :P
Ah no indeed, I'm the one who missed something: the size is calculated keeping the very last index accessed, so it will indeed see the correct rectangle... My bad!
@Sebastian: Wow.. I was thinking exactly the same thing.. and in fact, I corrected this part:
repl.it/repls/WoefulFavorableCustomer
And then I started looking for a comment, hoping that someone else (apart from me) would pointed out this.. and I found yours. Thanks for confirming that WE are right.
“i, like most people who work in java, dont know java.” i can relate.
Make some promises and you might get your callbacks .... I'm sad about this joke.
That's not a joke I made is it? I agree that it's awful.
Sina Nejati I can tell that you are probably a really l "fun" guy.
I await'ed at a sink
@@jackson-gabbard dude why'd you stop making these videos?
Okay so I played the video and I had to rewind in first 5 seconds
Dude ..thank you so much... I completed this problem ... :-p
< Your Largest Rectangle submission got 50.00 points. >
This was 8 years ago? Bro was way ahead of his time!
I have a question. This is obviously a coding interview problem, so you need to code the thing. But what if using stacks isn't the "obvious" method, and just talking your way through and using stacks is confusing to the interviewer? You'd obviously want your interviewer to agree that your code works right then and there. You're not really gonna debug it and test if it works. So you might want to draw those stack diagrams and the histogram. But should you be doing this?
When you're coding, is it okay to draw pictures to visualize your thought? And also, rather, SHOULD you be visualizing your thoughts during a coding interview?
In the interviews I've done, candidates who could draw a coherent visual to help them make sense of the problem tended also to write better code and explain their code better. If you can draw a visual quickly that puts you and the interviewer on the same page, I think that's definitely to your advantage. However, it's a matter of timing. If you spend 10 minutes diagramming, you're probably taking too long. 2 or 3 minutes, tops. Then focus on the code. Also, you totally should be debugging and testing mentally once you finish the code. Good question.
Jee B to
Not the most clear explanation (which might be a good thing) but makes people like us have to think and understand more about how it works.
You don't need the heights stack. Just modify the original heights array with the new reduced height values.
The implementation fails for [2, 1, 5, 6, 4, 4, 3]. It does not check if the next height is equal after encountering a smaller height. For the sample, it returns 10 instead of 16.
High quality all around. Well done, sir! You just earned yourself a sub.
Could you please explain the case when there is just 1 bar at position 0? I think the maxarea should be 1 but your code would return 0 since pos and tempPos would both be 0.
Just got a something new in an interview i haven't seen before. Find the amount of magic squares in a given rectangle 2d array. Took me a while to figure out the optimal way to do it
Well done and thank you Jackson. You made it so intuitive. Java version is here is for critic 🙂
public int findLargestRectangle(int[] heights) {
if (heights.length == 0) return 0;
int currentPosition = 0, tempPos = Integer.MIN_VALUE, maxArea = Integer.MIN_VALUE;
Deque positionStack = new ArrayDeque();
Deque heightStack = new ArrayDeque();
for (currentPosition = 0; currentPosition < heights.length; currentPosition++) {
int currentHeight = heights[currentPosition];
if (heightStack.isEmpty() || currentHeight > heightStack.peek()) {
positionStack.push(currentPosition);
heightStack.push(currentHeight);
} else if (currentHeight < heightStack.peek()) {
while (!heightStack.isEmpty() && currentHeight < heightStack.peek()) {
tempPos = positionStack.pop();
maxArea = Math.max(heightStack.pop() * (currentPosition - tempPos), maxArea);
}
heightStack.push(currentHeight);
positionStack.push(tempPos);
}
}
while (!heightStack.isEmpty()) {
tempPos = positionStack.pop();
maxArea = Math.max(heightStack.pop() * (currentPosition - tempPos), maxArea);
}
return maxArea;
}
Really clear explanation with beautiful visuals (did you actually write in reverse???), I just find the bg music a bit distracting but other than that true awesome!
I guess it would be a lot easier to just flip the video while editing.
wow this guy is so smart at cursing
Hey this video rocks! I had been puzzling for a while on how to do this, and the best I could do while getting a correct answer was O(n^2) time complexity, which is garbo. Thanks for the great explanation!
Is this not also O(n^2)? since there's a while loop inside a for loop?
probably the best explanation on UA-cam even today. Thanks, man.
They say you can grab a person's attention in the first 15 seconds of the video. You nailed it.
Jason Stathum from action hero to Software engineering he learned everything huge respect :P
+Jackson Gabbard
4:56 You seem to me to be ignoring a size 2x2=4 rectangle at this point.
A square is always rectangle, a rectangle is not always a square. Semantics beyond that.
Nemtrac5
Am I presumed not to have known that?
You literally point out the part at which he goes into the explanation of the 2x2...
Jack Sainthill there was another guy saying it was a square not rectangle but they deleted their comment.
Nemtrac5
What a little coward!
Cheers, you're right, I remember that now.
Thanks for this. I love seeing a solution in JS. I managed to do this problem using a tortured DP-ish solution which kept track of rectangle areas and heights. Nice to know there's a sane solution.
+Jackson Gabbard, JavaScript has Maps and Sets now (and WeakMaps and WeakSets), so not just 2 anymore. Although probably you knew that already.
I laughed so hard when he named the function popThatShit xD
after processing index 3, how is the 1x(4-1) rectangle of height 1 starting at position 1 ignored?
At 6:06 there's a mistake. The largest rectangle isn't 3, it's 4.
In the first example (8:16) you are computing size as 1*(5-0), where 5 is out of range of histogram positions. In your implementation pos is always < hist.length. So my question is how would you obtain maxSize == 5, for the first example of histogram [1,3,2,1,2]?
So, this algorithm has two loops. One loop, which I think is the one you've pointed out, only goes from 0 to 4 for this input. And you're right, that loop wouldn't pick up the 1x5 rectangle. Luckily, there's also a second loop. During this loop the position is actually 5, because the final incrementation has happened and pos is now equal to the length of the histogram array (that is, it's 5). So, in this second loop, you're actually using the full width of the histogram in the subtraction part of the formula.
Is he like writing backwards
Flip the video.
All your vids are so good I have learned to tolerate bad BGM
Is it only me? No matter how many time I read this still don’t get how does tempH*(pos-tempPos) get the area?
It is a shame you don't make videos like these anymore. You are much more didactic than the tops G's on youtube on this topic.
Regarding your brute force method, if I got you right then I think you're wrong: take the histogram [9,8]. Your brute force method will return 9 while the right answer is 16. You need to go both right and left (and not only right)
A bonus question: is the author/presenter left-handed or right handed? Many thanks for a stellar example on how to make a UA-cam video!
Hey, thanks for the video.
I have a quick question if you don't mind. When you went from 3 to 2, you only popped the top value from the height stack (since the rectangle at index 2 started from index 1). However, when you go from 2 to 1, you pop from both stacks. Can you explain why? From my understanding, there is still a rectangle from index 1 to index 3 with height 1.
So what I have in the Position and Height stack when i = 5 is:
P - H
4 - 2
1 - 1
0 - 1
Thanks!
when you reached 2 at position 2 you poped 3(as it was bigger than 2)but then you pushed 2 to form a rect of 2*2.
BUT when you reached 1 at position 3 you poped 2(as it was bigger than 1)but then you didn't pushed 1 to form rect of 1*3??
please explain..
The algorithm does exactly that if you follow it or run it, it pushes 1*3 when reaching position 3. He probably missed it when doing the explainations...
Alexandru Coman thanks
Presentation + effort + explanation = +1 subscriber
Hi Jackson, your two stack approach is much easier to compute area.
When I first see this problem, I thought about stack and keep adding as long as me is larger than top of stack while content of stack is larger me, keep popping.
But what I stuck was in your example, when index is 3 with values [1,3,2,1], I thought I have to compute all possible rectangles such that [1]=1, [2,1]=2, [3,2,1]=3, [1,3,2,1]=4,
but no videos explain why I don't have to compute the rectangle between two indices [0, 3] and instead they just compute [1, 3] which means we always guarantee that area between indices [1, 3] always larger than indices [0, 3].
I don't understand how come area between [1, 3] always larger than [0, 3] ?
Cool video! As a general idea for avoiding popping that shit at the end, you could insert a 0 at the end of the histogram. Or is this too hacky?
That's interesting! I'd guess explicitly popping is more... explicit and clear. Can't wait for more opinions/logic on this :)
Wait What?!?! How could you write backwards like that?????
Xingzhe Xin He's actually right handed :P
how is the person opposite while the words he write not?
Xingzhe Xin lol because if he's facing the camera from the other side of the glass while writing with his right hand.... then the text would appear backwards. So he then flips the video (making it appear as though he's left handed) and then the text is in the correct direction again.
Also, note that the logo on his t-shirt is on the wrong side :P
Just discovered, this channel. Simply love it!
just found your channel, its awesome! keep being yourself and hopefully you upload more soon. thanks!
What might this algorithm be used for? What value is there in knowing the area and position of the largest rectangle?
TaG, there are a million real-world algorithms where this might be useful. For instance, image processing. If you're trying to identify the dominant luminosity range of an image perhaps. In audio processing, you might use a similar approach to determine the primary frequency range in an audio sample. You might also use it in GPS-related calculations, looking for the period of movement within a range of time.
How has he created this visual? It looks like he's writing on a transparent glass and he's on the other side.. but then that'd mean he is writing in a mirrored manner. If he's writing on a mirror, then how is he behind the board?
Your step by step explanation is confusing. You explained that at i=2, we dont remove from the position stack because the square actually started at i=1 where height=3 was. But in your code, you are actually popping it out and pushing it back in.
Would the largest rectangle be in the empty space and not the "stacks"?
"...getting a little bit bored with the polite, PC...."
subscribed.
Elegant solution to the problem, but what analysis did you do to come up with this solution or is it that it's a well known problem with an equally well known solution. My thinking is are people coming up with creative solutions to problems based on their own hard work and ingenuity or is it just an exercise in knowing classical problems.
I came up with this solution myself. It's on hackerrank in the stacks category, so you already get a hint that you should be using stacks. From there on you find out what you need to retain in order to find the largest area.
Finally, someone has succeeded in explaining this question.
Fuuuuuucccckkkk, this is mindblowing explanation. Please make more videos like this. Also normally I watch videos at 1.5x this is the first video I watched at 0.75x
How the fuck did he write those words at the start in reverse so well?
I'd be very interested in seeing a solution with non uniform class widths I imagine a similar approach but where the total width passed through would be stored rather than the starting location. If given the question from the video in an interview. Would the interviewer prefer I simplify the problem and assume unity or that I handled for other cases?
wouldnt be a histogram then.
*We can do this with only single stack too*
Jackson Gabbard, I can't seem to follow how you got the starting position for the 3rd bar with height 2, for example if you took away the first bar and you just have an array of histogram heights of 3,2,1 how would you know that starting point of say height 2 or height 1. I think you need to hold these values. I would create a hash map which has height as the key and increment it each of the key by one if it qualifies/valid or pop it and compare it to the max value. A good test case to consider is 3,3,3,2,1,2,4,4,3,3,2,0,3,3,3,2,2,1,1,1,1,1
you don't need the weird sound effect. It messes things up
I am wondering how did you take this video? It looks very interesting!
What happens if you replace the tempPos logic with pstack[-1]+1 when stack is not empty and let it be zero when stack is empty? Basically I am thinking the tempPos logic may be redundant. Am I wrong? In what cases does this not work if it doesn't?
do you write backwards on the board
oh dear god.. =) No he flips the video in post to make it correct for the camera.
Mattias Stahre, that's not what I heard. I heard he actually turns the camera around backwards.
It's easier when you're lefthanded like he is in the video.
Did you leave it to dry for a while before you cleaned it at the end? The letters don't drip, but they move in tact... weird effect.
How does the letters just slide off like that ?
Great video performance!
But from the algorithmic point of view I would suggested this (in pseudo code)
maxArea = 0
for all l:listOfConnectedRectangles in listOfListOfConnectedRectangles
do
currentArea = width(l) * min(height of rectangles in l)
maxArea = max( maxArea, currentArea )
end
And ah well, yes, I would also need to specify how to derive listOfListOfConnectedRectangles. :)
Anyway, this is a suggestion from the top of my hat, what do you think?
In your code the min(height of rectangles in l) will give an incorrect result, as the best area of listOfConnectedRectangles is not the lowestHeight(l)*width(l). E.g. in case of l = [1, 2, 4, 5], the currentArea should 4 * 2 = 8 instead of 1 * 4 = 4
Need to think about that. Thanks :)
Doesn't it depend on how Eduard defines 'listOfConnectedRectangles' and 'height of rectangles in l'?
I think he rather meant something like (given your example input):
"take the rectangle of width 4 (starting at 1); its height is 1 (the min value), so its area is 4;
now take the next rectangle, of width 3; the min is now 2, so the size is 6; etc. etc."
In this case it would be correct.
The problem is it is very far from optimal: it is just the 'brute force' approach Jackson talks about at the beginning of the video (2:12). Since you potentially loop over all the columns for each and every column, it takes O(N^2), while the stack-based solution presented here is O(N)...
2×2 is not a rectangle, its a square assuming that the length between each height is the same. so if the 2×2 happened to be saved as the largest, it would be the wrong answer. there would need to be a code somewhere that ignores the 2×2 because the length and width are the same.
All squares are rectangles!
Chandan Yadav disappointingly, you are right. 1 more common sense rule for a rectangle would eliminate this phenomenon. That rule being:
"That parallel sides must be equal,but not equal to the adjacent parallels side."
I call this new definition a "rectale". That way a square can never be a rectangle again.😂
1. It isn't a common sense rule.
2. Then, a square isn't a "rectale", but a square is 'Always' a rectangle! :P
Yeah, I meant that under the Rectale rule. A square isn't a Rectale but a square is a rectangle. But hopefully we would never use rectangle again.
I guess we should stick with rectangle since we don't have the social or political power to indoctrinate the country into accepting and practicing the "Rectale" shape/rule.😂
If I had 20 seconds to stop a nuclear launch from destroying the world and I told my assistant "hurry, bring me the rectangle key".
He could by definition bring me the square key when I needed the other. All of Human advancement could be destroyed over a weird rule that doesn't fully separate these 2 shapes.
life is funny😂
Yeah. But you are not a world saving Terminator hero who doesn't know maths. You are a programmer who should know that when you are asked for a rectangle, you must include squares too. If you still insist on saving the world in your movie using the rectangle key, make sure that it is directed by Nolan so that he can take care of the technical things accurately and have the option between rectangle and circle and not rectangle and square! :P
It is not a weird rule that separates these shapes. It's just how these are defined. A square is a rectangle, a rectangle is a polygon, a circle is an ellipse... A programmer should know that.
Thank you so much
was stuck on this problem for days, finally clicked ✨
I wonder if it will going to be really a rectangle at the end of the day.. a square maybe?
Can't we just add a 0 at the end of the histogram array? So we would have a bar of height 0, but that last step where you have to take into consideration the 0 - 1 stacks, you would get 0 so less than 1, you pop 1 and the new area becomes 1*(5-0) = 5(according to the formula)? Just asking, I am not that good when it comes to algorithms.
Here’s another approach (literally: bottom up rather than left to right). In pseudo code.
DEFINE FUNCTION maxSize(INT start, INT stop) RETURNS INT
LOCAL INT i
IF start
Oops. IF start>stop RETURN 0. Sorry.
Really great vid! Like how you keep the problems interesting and offer entertaining and clear explanations. Enjoy your work a lot :)
I'm super jealous of your markers. I need blood markers in my life.
1) I think you are missing to mention the time & space complexity. Is this the efficient solution ? Kind of like build towards the efficient one, from brute force.
2) Naming the position stack as starting position stack would have saved me some confusion :P
I am curious how he created writing on the glass effect. Any one knows?
That's how I do interviews, walk in the room and say "hey, what's up motherfuckers?"
Initially i confused that video is not synched with audio and got stuck! But overall it is good effort.
What is the complexity for this algo? This can be done in O(n) if you drop the stacks and only use a few variables using intelligent linear drag.
This algorithm is clearly O(n). You can only ever add something to the stack once and pop it off once. Stack operations are O(1), so linear on size of input histogram.
man started the vid with "what up mothafuckas" LMFAO
How do you write backwards?!
He draws normally, then uses editing software to mirror (flip) the video.
Shhhh. Don't give away the seeeeecrets!
Also, the logo on his t-shirt is on the wrong side :P Sooo yeah, good job with that effect :D
Is he writing backwards on the glass?
are you fluently writing form right to left with the characters mirrored !
Loved the video ! Infinitely more interesting than other ones out there.
I don't understand this, how do you write so good backwards?
This is a coding interview example? Holy shit! you would have to solve this while some dudes are watching your every move?
I had this in an interview today. FML. I bombed it.
Now that's a lot of shit popping
I don't know JavaScript, but isn't there an error in the while condition?
Dude ..thank you so much... I completed this problem ... :-p
Your Largest Rectangle submission got 50.00 points.
Pradeep Ravi Where did you find this problem? If there is online judge, I'd like to test my implementation also :)
Охтеров Егор www.hackerrank.com/challenges/largest-rectangle -hackerrank
Pradeep Ravi Thank you!
Is it weird that I know who you are because you use the same picture on Codeforces as you do here on UA-cam? Pixar I believe. Cool to randomly come across another coder like this!
A3MON This was not random =)
How did you create a video that makes you look like you are writing on glass?
I was going to comment that you should use let instead of var, but then I realized this was made in 2016.
Very cool problem. Sadly, the implementation of the problem's solution is a bit too large for an interview question.
I'm naming the pop method popThatShit(), the next time I'm asked to create a dumb Stack class during an interview.
Great video, going to binge watch the rest now.
You didn't explain why when 3 was poped, you kept its index, but when 2 is poped, you pop the index. The presentation is good but you missed the crucial part of this problem which was when to pop the index stack.
Does your solution work with non continuous histogram like [0,3,2,3,0,4,7,3]?
It does, why wouldn't it?
My kids were in the room when I listened to this... Please give the warning first ...
I think this is a good algo. But a hard interview question because I think the probability of coming up with this O(n) solution in the middle of an interview having never seen this problem is low.
missed the case of equals(h === hstack[len-1]). nice video btw.
This case is covered in the code.
Try this example with histogram height value [1, 2, 3, 2, 1]. The code will find the correct rectangle area which is 2 * 3 = 6.
Quick question, if a z axis was involved of the histogram, how would that look in code? Sorry I am uber new like just beginning codecademy new :
that would just introduce an extra stack shit. and some more iteration development
Thank you, so would you then have to calculate cubic area to find stack values
This question is wild. Awesome explanation :)