Тёмный

Snakes and Ladders - Leetcode 909 - Python 

NeetCode
Подписаться 830 тыс.
Просмотров 52 тыс.
50% 1

Опубликовано:

 

6 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 95   
@NeetCode
@NeetCode 2 года назад
Python Code: github.com/neetcode-gh/leetcode/blob/main/909-Snakes-and-Ladders.py Java Code: github.com/ndesai15/coding-java/blob/master/src/com/coding/patterns/bfs/SnakesLadders.java (from a viewer - ndesai)
@studyaccount794
@studyaccount794 2 года назад
I remember I used to play this game with my siblings and friends as a kid. Now, here I am. Solving this problem all alone on leetcode in a locked room in hope of getting a good job.
@daringcalf
@daringcalf Год назад
Same here. I was gonna kill myself for stuck at this problem and Neetcode saved my life.
@FlashLeopard700
@FlashLeopard700 Год назад
@@daringcalf doing the daily challenge eh? me too
@shashwatsingh9247
@shashwatsingh9247 Год назад
Hope you got a good one !
@makxell
@makxell 10 месяцев назад
I hope you both made it
@studyaccount794
@studyaccount794 13 дней назад
Ohh I don't remember making this comment lol. Anyways, I did get a job but it's not a good one so I'm back again. I made this comment when I was in college. Good thing I had a job fresh out of the college so the hard work wasn't for nothing ig haha
@sibysuriyan9980
@sibysuriyan9980 2 года назад
"ive never played this game" *proceeds to code the entire game perfectly*
@amitupadhyay6511
@amitupadhyay6511 2 года назад
I was waiting for this question since 2 weeks . Its a trending question, being asked in many recent interviews and OA.
@AayushVatsa
@AayushVatsa 5 месяцев назад
FOR CONVERTING LABEL VALUE TO CO-ORDINATES. It will be better to create a map once with the exact structure of board rather than reversing it and doing complex maths everytime. -- Code private Map getCellValToCoordinateMap(int n) { Map map = new HashMap(); boolean reverse = false; int val = 1; for(int r=n-1; r>=0; r--) { if (!reverse) { for(int c=0; c=0; c--) { map.put(val, new Pair(r, c)); val++; } } reverse = !reverse; } return map; } --
@_athie2544
@_athie2544 Год назад
Very easy to understand! Love this solution. You are the best RU-vidr on solving Leetcode problems.
@pichu8115
@pichu8115 2 года назад
Could you make a video of teaching us how to visualise concepts or anything or introducing some materials inspiring you how to visualise things? I think it must be very useful!
@dinankbista5794
@dinankbista5794 Год назад
Here is the java implementation: class Solution { public int snakesAndLadders(int[][] board) { reverseBoard(board); Queue queue = new LinkedList(); queue.add(1); int steps =0; HashSet visited = new HashSet(); visited.add(1); while(!queue.isEmpty()){ int size = queue.size(); for (int i=0; i< size; i++){ Integer curr = queue.poll(); if (curr==board.length * board.length) return steps; for (int j=1; j board.length * board.length) continue; if (board[res[0]][res[1]] != -1) { next = board[res[0]][res[1]]; } if (!visited.contains(next)){ visited.add(next); queue.add(next); } } } steps++; } return -1; } public void reverseBoard(int[][] board){ for (int i=0; i< board.length/2; i++){ for (int j=0; j< board[0].length; j++){ int[] temp = board[i].clone(); board[i][j] = board[board.length-1-i][j]; board[board.length-1-i][j] = temp[j]; } } } public int[] coordinateConverter(int pos, int[][]board){ //O based indexing int row = (pos-1) / board.length; int col = (pos-1) % board.length; if (row%2==1) { col = board.length-1-col; } return new int[]{row, col}; } }
@mr6462
@mr6462 2 года назад
Thanks for the great video! I am wondering if this problem can be solved using DP? I couldn't seem to find a good recursive substructure as the best steps to reach 13 may actually come from 17.
@kinghanzala
@kinghanzala Год назад
If it hadn't been for the snake, then it could have been solved I guess 🙂
@danielng8083
@danielng8083 2 года назад
Thanks!
@NeetCode
@NeetCode 2 года назад
Thank you so much Daniel!
@srikid100
@srikid100 2 года назад
I really like all your videos ! Great explanation and easy to understand- thanks !!!
@robogirlTinker
@robogirlTinker 2 года назад
Hello Mr. Neetcode, I watch your RU-vid videos and i really appreciate the way you explain. I just love it. Can you please make video on how do you find Time complexity and Space complexity so easily?
@infiniteloop5449
@infiniteloop5449 Год назад
If we can use extra memory, the implementation of intToPos becomes way easier if we convert it to a 1D array.
@vidhishah9154
@vidhishah9154 2 года назад
Hi, Your explanation goes straight to head and problem becomes easily solvable. Thank you for your help to the community. Can you please cover the leetcode problem 811 - subdomain visit count and leetcode 459 - Repeated Substring Pattern? This would be a big help. Thanks
@jonaskhanwald566
@jonaskhanwald566 2 года назад
you can make the hardest part easy by just converting the grid into an array like this: (If direction is negative, append the rows in reverse order) dir = 1 a = [0] n = len(board) for i in range(n-1,-1,-1): if dir>0: a.extend(board[i]) else: a.extend(board[i][::-1]) dir*=-1
@noormohamed8005
@noormohamed8005 Год назад
I had a small change to it. So that we can access it using row and column. If there any advantage by converting it a single array, how will i access the values? b = [] a = [0] d = 1 n = len(board) for i in range(n-1, -1,-1): if d > 0 : a.extend(board[i]) b.append(a) else : a.extend(board[i][::-1]) b.append(a) d = d * -1 a = [0]
@clandestina_genz
@clandestina_genz Год назад
Man , this problem is absolute mind boggling
@martiserramolina5397
@martiserramolina5397 12 дней назад
Thank you very much!
@ngneerin
@ngneerin 2 года назад
Love the leetcode solutions. Looking for more such videos
@dhanrajbhosale9313
@dhanrajbhosale9313 Год назад
without reversing the board def int_to_pos(self, square, n): square = square-1 div, mod = divmod(square,n) r = n-div-1 if (square//n)%2: c = n-mod-1 else: c = mod return [r, c]
@siftir2683
@siftir2683 2 года назад
how is this BFS traversal taking care of the case when a single move contains 2 ladders? Like for this example in the video, the "15" box could have a ladder of its own that wouldn't be taken if we took the ladder at "2". How do we know that ladder wouldn't take us faster?
@arpanbanerjee6224
@arpanbanerjee6224 Год назад
@neetcode, can you please explain this part
@ratin754
@ratin754 Год назад
suppose you go from 2 to 15. 15 is added to q. 15 also has a ladder but you are not doing any advancement. now when 15 is popped from the q, you will either be adding 1,2,3, etc to it, never 0. so 16, 17 etc would be added to the q
@navaneethmkrishnan6374
@navaneethmkrishnan6374 5 дней назад
For anyone confused, that's exactly the game of snakes and ladders. You are forced to take the ladder or the snake as you go. You can't also take two ladders in a row. It's the game rules.
@MP-ny3ep
@MP-ny3ep Год назад
Phenomenal explanation. Thank you
@begula_chan
@begula_chan 5 месяцев назад
Thank you very much! That was really good
@alijohnnaqvi6383
@alijohnnaqvi6383 3 месяца назад
One edge case missed, if from the current position we can reach at end, we do not need to put it as (moves+1). We can stop our algorithm there. The test case for it is: [[-1,-1,-1],[-1,9,8],[-1,8,9]] Updated code: class Solution: def snakesAndLadders(self, board: List[List[int]]) -> int: n = len(board) board.reverse() def intToPos(square): r = (square-1)//n c = (square-1) %n if r%2: # odd c = n-1-c return [r,c] moves_collected = [] def bfs(): visited = set() q = [] q.append([1,0]) while q: square,moves = q.pop(0) for i in range(1,7): nextMove = square+i if nextMove
@kanhakesarwani971
@kanhakesarwani971 Год назад
Here's a C++ implementation of the approach discussed above. I am facing problem in a test case: [[-1,-1,-1],[-1,9,8],[-1,8,9]] Please help. class Solution { public: vector intToPos(int square, int n){ int r = (square-1)/n; int c = (square-1)%n; if(r%2) c = n-1-c; vector pos; pos.emplace_back(r); pos.emplace_back(c); return pos; } int snakesAndLadders(vector& board) { int n = board.size(); reverse(board.begin(),board.end()); queue q; q.push({1,0}); unordered_set visited; while(!q.empty()) { pair curr = q.front(); q.pop(); int square = curr.first; int moves = curr.second; for(int i=1;i
@YairGOW
@YairGOW 2 года назад
You can also avoid using the moves variable and just count how many levels you've gone through throughout the bfs. So just add the newly discovered nodes to an auxiliary queue, then when the main queue is empty you know you're at a new level and then the aux queue becomes the main one. This continues obviously until you reach the last node or aux and main are both empty (which means no way to reach the end goal).
@daringcalf
@daringcalf Год назад
True. Just queue := []int{1} could do.
@muadgra3545
@muadgra3545 2 года назад
Great video, as always.
@zhgjasonVT
@zhgjasonVT 2 года назад
Well explained! Thanks!
@amandwivedi1980
@amandwivedi1980 2 года назад
very nice explanation :) Keep up the good work !!!
@krateskim4169
@krateskim4169 Год назад
Awesome explanation
@mariusy6944
@mariusy6944 8 дней назад
Could the board be converted into a one-dimensional array to simplify the problem and nothing else would change?
@__________________________6910
@__________________________6910 2 года назад
I played this game in my childhood.
@haritjoshi878
@haritjoshi878 2 года назад
Great video with super clear approach discussion but a quick doubt why you did n - c - 1 for the column? Yes I know because of the alternating fashion we will get wrong values for the column for the square or cell value, like why that n - c - 1 worked even tho it worked as this can be a good question for the interviewer to ask.
@subhasisrout123
@subhasisrout123 Год назад
Which part of the code prevents consecutive snakes or ladder ? This was one of the requirement.
@altusszawlowski4209
@altusszawlowski4209 9 месяцев назад
the fact that he doesnt have a while loop on the condition if the cell is not -1
@gabrielfonseca1642
@gabrielfonseca1642 13 дней назад
The BFS goes from i to (i + 1, i + 2, ... i + 6). Since 0 is not added, the next move will never take the ladder at the same position. It can only be reached from i - 1 and below (which will be another path found by the algorithm). Note that the if statement ensures that if we try to reach position i via a dice roll, the destination gets replaced by the ladder destination.
@lingyuhu4623
@lingyuhu4623 Год назад
what if the nextSquare is greater than length * length? Why we dont have to take that into consideration?
@jayeshnagarkar7131
@jayeshnagarkar7131 Год назад
hey bro, i have the same question.. can you please explain if you knew the answer ? :)
@ShivamSharma-me1sv
@ShivamSharma-me1sv 6 дней назад
Can we solve this by creating a mapping from 1,2,3,4..n^2 to -1,-1,-1,-1.....? will this have worse space complexity?
@xiaohuisun
@xiaohuisun Год назад
should not add a square to the visited if that square is reached by a shortcut, since that square could have a shortcut itself, and could make a quick move if reached by a normal move
@sampathkodi6052
@sampathkodi6052 Год назад
we are exploring every possible value from lets say from x + 1 to x + 6 for each x which gives an intution as it was a backtracking problem exploring all the possible path until reached n^^2. Is it correct or am I missing something?
@altusszawlowski4209
@altusszawlowski4209 9 месяцев назад
possibly, backtracking would give you all paths to n^2 and then you would need to find the min from all those paths, bfs allows you to break an return once you find the shortest path
@LarryFisherman5
@LarryFisherman5 Год назад
Simpler version of intToPos without reversing the board: n = len(board) def int_to_pos(idx): i = ~(idx // n) j = idx % n if i % 2 else ~(idx % n) return i, j
@srushtinarnaware4919
@srushtinarnaware4919 2 года назад
thanks
@_nucleus
@_nucleus 2 месяца назад
You literally can do it without reversing with the same code, just one line change class Solution { public: pair num_to_pos(int num, int n) { int r = (num - 1) / n; int c = (num - 1) % n; if (r % 2 == 0) { return {n - 1 - r, c}; } else { return {n - 1 - r, n - 1 - c}; } } int snakesAndLadders(vector& board) { int n = board.size(); queue q; // {square, moves} q.push({1, 0}); vector visited(n, vector(n, 0)); while(!q.empty()) { auto node = q.front(); q.pop(); int square = node.first, moves = node.second; for(int mov = 1; mov n * n) continue; pair pos = num_to_pos(next_square, n); if(board[pos.first][pos.second] != -1) { next_square = board[pos.first][pos.second]; } if(next_square == n * n) return moves + 1; if(!visited[pos.first][pos.second]) { visited[pos.first][pos.second] = 1; q.push({next_square, moves + 1}); } } } return -1; } };
@user-le6ts6ci7h
@user-le6ts6ci7h 11 месяцев назад
If somebody seeing this take a note of this test case , [[-1,1,1,1],[-1,7,1,1],[16,1,1,1],[-1,1,9,1]]. How come there is an answer to this. it must be -1 ,but leetcode is expecting 3.
@anthonydushaj3844
@anthonydushaj3844 2 года назад
Very neat !
@sahejhira1346
@sahejhira1346 5 месяцев назад
but i don't understand- which instruction tells the algo to output the minimum number of moves required to reach n**2th element.
@edwardteach2
@edwardteach2 2 года назад
U a Snake & Ladders God
@rahuldwivedi4758
@rahuldwivedi4758 9 месяцев назад
What if there are two ladders in a possible move, the later being the bigger one. Why do you take the first ladder itself?
@decostarkumar2562
@decostarkumar2562 2 года назад
Can we use dynamic programming?
@unofficialshubham9026
@unofficialshubham9026 Год назад
where did you take care of the case that no two snake/ladder are taken in one move
@giantbush4258
@giantbush4258 7 месяцев назад
It's easier to convert the 2D to a 1D representation
@pinquisitor9552
@pinquisitor9552 2 года назад
For the r,c I’d just create a dictionary v:[r,c], no need to switch rows or start from 0…
@shatakshivishnoi916
@shatakshivishnoi916 Год назад
great explanation!!..what would be complexity of this code?
@altusszawlowski4209
@altusszawlowski4209 9 месяцев назад
Very complex
@dss963
@dss963 Год назад
There is a mistake in the intopos function I guess , because for the r value it should be( length-1 ) -(square-1)//n.
@firezdog
@firezdog Год назад
I think if you did DFS it might not find the shortest path.
@stormarrow2120
@stormarrow2120 2 года назад
yeah the heck eith that r,c transformation.. yuck as a design standpoint. it would be so much more intuitive to just keep track of this game in a 1D array.
@shivamrawat7523
@shivamrawat7523 Год назад
why did you used bfs here? how could I know if I have to use bfs or dfs?
@arunraman6630
@arunraman6630 2 года назад
The hardest part about this question for me was converting from Boustrophedon form. After that, it's just your bog-standard BFS
@CostaKazistov
@CostaKazistov 2 года назад
Not only Boustrophedon, but a *reverse* Boustrophedon en.wikipedia.org/wiki/Boustrophedon#Reverse_boustrophedon which is an additional step 🤔
@justadev____7232
@justadev____7232 Год назад
How do we know how far the snake takes you? You stated when we reach 17, the snake takes us to 13. Why not 15 or 14?
@huizhao2050
@huizhao2050 2 года назад
Hi, one question for big tech companies interview? Can I use google search in online code assessment?
@ohyash
@ohyash 2 года назад
Depends on the assessment. Most of them allow you to use google. Very few don't. You'll know in the assessment instructions itself about this. Read that before starting the assessment.
@po-shengwang5869
@po-shengwang5869 2 месяца назад
how are you sure that it's the min steps to get to the final destination?
@surajbahuguna8560
@surajbahuguna8560 Месяц назад
It's BFS so we are traversing level by level. All elements in a level can be reached in same number of moves. Any element in the next levels would require a greater number of moves. Hence the first element or the first level to reach N*N will have the minimum number of moves.
@jamesmandla1192
@jamesmandla1192 Год назад
I didn't know in Snakes and Ladders if you moved past a snake/ladder you didn't actually have to take it. So I over-complicated the problem a lot LOL
@infiniteloop5449
@infiniteloop5449 Год назад
I think its the opposite case in the real game right? Otherwise why would anyone take a snake....
@jamesmandla1192
@jamesmandla1192 Год назад
@@infiniteloop5449 you’re right, I worded what I said earlier poorly. I meant if your dice roll moves your piece to a position after the snake/ladder it means u move to that position directly instead of taking the snake/ladder first. I guess that’s how it works in most board games though 😂
@sayankabir9472
@sayankabir9472 Год назад
1:48 bro really said he never played Snake and Ladder. I'm shocked
@suraj8092
@suraj8092 Год назад
He probably grew up in America
@RobinHistoryMystery
@RobinHistoryMystery 6 месяцев назад
“A game that I never really played” , bro missed out😢 on
@atpk5651
@atpk5651 Год назад
Is it just me or facebook interview questions are actually kind of tricky??
@raunaquepatra3966
@raunaquepatra3966 2 года назад
Could have just converted the grid to a list
@adarshsasidharan254
@adarshsasidharan254 Год назад
the fact that you've never played Snakes and Ladders amazes me
@solomon8229
@solomon8229 2 года назад
why use column and row. turn it into a standard list with 36 elements. no extra coding neaded
@Ash-fo4qs
@Ash-fo4qs 2 года назад
c++ code?
@joeleeatwork
@joeleeatwork 2 года назад
Thanks!
@NeetCode
@NeetCode 2 года назад
Thank you so much Joe!!
@light_70
@light_70 11 месяцев назад
great explanation
Далее
Open the Lock - Leetcode 752 - Python
14:22
Просмотров 40 тыс.
The Beautiful Math of Snakes and Ladders - Numberphile
21:46
Women’s Free Kicks + Men’s 😳🚀
00:20
Просмотров 13 млн
Construct Quad Tree - Leetcode 427 - Python
12:26
Просмотров 23 тыс.
LeetCode was HARD until I Learned these 15 Patterns
13:00
How to Solve ANY LeetCode Problem (Step-by-Step)
12:37
Просмотров 245 тыс.
Surrounded Regions - Graph - Leetcode 130 - Python
14:50
The hidden beauty of the A* algorithm
19:22
Просмотров 866 тыс.