Тёмный

Triangle - Dynamic Programming made Easy - Leetcode 120 

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

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

 

18 сен 2024

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 90   
@NeetCode
@NeetCode 3 года назад
Dynamic Programming Playlist: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-73r3KWiEvyk.html
@insideout3795
@insideout3795 Год назад
modified the solution to inplace class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: if not triangle: return 0 for row in range(len(triangle)-2, -1, -1): for index, value in enumerate(triangle[row]): triangle[row][index] = value + min(triangle[row+1][index], triangle[row+1][index+1]) return triangle[0][0]
@heyrmi
@heyrmi 3 года назад
I lost the hope when I realized my IQ was -90.
@shrimpo6416
@shrimpo6416 3 года назад
As someone who has absolutely NO coding background and just started at mid-to-late August, I just want to THANK YOU for making these terrific videos! I just passed the first round of tech interview at Huawei only because of you!!! I highly recommend your channel to everyone who wants to become a swe!!!
@AIPlayerrrr
@AIPlayerrrr 3 года назад
Thanks for the video. I've been following along. 14:10 should be 3+4 = 7 I think.
@DoJoStan
@DoJoStan 3 года назад
It actually should be 10. [4, 1, 8, 3, 0] [7, 6, 10] [9, 10] [11]
@larrygoldstein2438
@larrygoldstein2438 3 года назад
@@DoJoStan Why should it be 10 instead of 7? Thanks
@DoJoStan
@DoJoStan 3 года назад
​@@larrygoldstein2438 Sorry I got mistaken with what's on leetcode and whats the example that Neetcode has here in his video. It is actually 7 in his example. however on leetcode, the example given is [[2],[3,4],[6,5,7],[4,1,8,3]]. Which is 10. In the example that Neetcode has here he is evaluating [[2],[3,4],[6,5,4],[4,1,8,3]]
@omkarbhale442
@omkarbhale442 Год назад
Right
@ayushrawat9267
@ayushrawat9267 4 месяца назад
the question is quite similar to minimum path sum in grid..... so here is the soln : class Solution { public: int minimumTotal(vector& triangle) { vector dp(201, vector(201, -1)); int result = solve(triangle, triangle.size(), 0, 0, dp); return result; } int solve(vector& triangle, int m, int i , int j , vector& dp){ int n = triangle[i].size(); if(i >= m && j >= n) return INT_MAX; if(i == m-1) return triangle[i][j]; if(dp[i][j] != -1) return dp[i][j]; int ans1 = solve(triangle, m, i+1, j, dp); int ans2 = solve(triangle, m, i+1, j+1, dp); int res = min(ans1, ans2) + triangle[i][j]; return dp[i][j] = res; } };
@benjaminjorgensen2931
@benjaminjorgensen2931 Год назад
This channel is a legitimate goldmine. I solved this problem top-down but I'm grateful I checked out this channel all the same because the bottom-up solution is 10x more elegant.
@yilmazbingol4838
@yilmazbingol4838 3 года назад
I finally understood dynamic programming. Whoever fully understands the concepts in this video, will definitely pass the algorithm interview.
@SK-cd9kk
@SK-cd9kk 2 года назад
me understanding the theory but being too dumb for programming by myself
@yilmazbingol4838
@yilmazbingol4838 2 года назад
@@SK-cd9kk you need practice. Do not give up so quick. How do you think people get good at something?
@SK-cd9kk
@SK-cd9kk 2 года назад
@@yilmazbingol4838 i am just at the beginning of learning solving algorithms, so i will go on
@AwesomeCadecraft
@AwesomeCadecraft 9 месяцев назад
Same! It feels so cool to finally understand the concepts, good luck on your programming journeys everyone
@thelookofdisapproval8234
@thelookofdisapproval8234 3 года назад
I did something clever and instead of allocating new memory I just reused the given array, starting from second last row to the top
@NeetCode
@NeetCode 3 года назад
That's smart, I didn't think of that, nice!
@ax5344
@ax5344 3 года назад
@14:13, dp row should be 7, 6, 7, right? 4+ min(8, 3) = 7
@inFamous16
@inFamous16 2 года назад
It should be 7 in given example but in leetcode, there is 7 instead of 4. So, it should be 10 i.e., 7 + min(8, 3) = 10
@za168
@za168 Год назад
@@inFamous16 Thanks, I was so confused !
@gunabalang9543
@gunabalang9543 25 дней назад
after 120 consecutive days of practicing, now i can solve problem just after seeing your visual explanation.
@shelllu6888
@shelllu6888 2 года назад
*THE* clearest way I've seen on this problem! Really appreciate the drawing at the end on how the algorithms stores the result. Thank you so much!!
@shubhaverma5697
@shubhaverma5697 2 месяца назад
I dont think anyone can draw and explain recursive or dfs trees better than you. Thanks @neetcode. I added this question to 'Favorites' on my leetcode.
@helario1
@helario1 2 года назад
Excellent visualization and explanation of your problems. Your voice is best suited for professor of any big university. Just one question - What tool do you use for visualization?
@ritwik121
@ritwik121 2 года назад
@neetcode knows how to teach ds algo in the correct way... kudos to you
@hhcdghjjgsdrt235
@hhcdghjjgsdrt235 2 года назад
I did it myself, but thanks to NeetCode, I had no coding background, no degree, its been 4 months Ive started coding in Leetcode and unity ( a game engine ). I learned a lot in this channel.
@moulee007
@moulee007 2 года назад
your leetcode id?
@hhcdghjjgsdrt235
@hhcdghjjgsdrt235 2 года назад
@@moulee007 Pramit Samanta user5010fN Ive just started and Im a civil engineer
@vijethkashyap151
@vijethkashyap151 Месяц назад
Top Down code for the idea described here, if anyone's interested :) class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: @cache def dfs(i, j): if i + 1 == len(triangle): return triangle[i][j] left = triangle[i][j] + dfs(i + 1, j) right = triangle[i][j] + dfs(i + 1, j + 1) return min(left, right) return dfs(0, 0)
@kartikhegde533
@kartikhegde533 2 года назад
The solution just blew my mind. This approach is simply genius ! Thank You.
@nihshrey
@nihshrey 3 месяца назад
I think just to optimize space, you don't have to create a new array, you can replace the existing array provided.
@talkwithrd5697
@talkwithrd5697 2 года назад
C++ solution for the same question class Solution { public: int minimumTotal(vector& nums) { int n = nums.size(); int last = nums[n-1].size(); int ans=nums[0][0]; vectordp(last+1,0); for(int i=n-1;i>=0;i--){ for(int j=0;j
@numberonep5404
@numberonep5404 2 года назад
After 1 hour and a half of grinding, i solved it with a "Runtime: 88 ms, faster than 44.09% of Python3 online submissions for Triangle."(with dfs and memoization), i wouldn't have found it in an interview setting in a million years xD These pbs are tough...
@horanj.1022
@horanj.1022 10 месяцев назад
one can do O(1) space if use triangle matrix itself for DP matrix. no need for a bigger DP: we can just start from one-to-last row and move up
@fatty-it-man
@fatty-it-man 9 месяцев назад
wonderful!! Excellent preparation for SW dev interview!!
@hwang1607
@hwang1607 8 дней назад
good solution for confusing problme
@sinarb2884
@sinarb2884 2 года назад
dp[i] = n + min(dp[i], dp[i+1]) is neet! After updating dp[0], we don't need its value for the rest of updates till we are done with the current row. This is due to the shape of a triangle. Update: You explained it already after the code :)
@lukt
@lukt 2 года назад
Best explanation on RU-vid, you make it seem so easy, thank you! :)
@m.m.farhad5292
@m.m.farhad5292 2 года назад
You are the best, you always make problems easier than they really are. Kudos!!!!!
@toniatrius641
@toniatrius641 21 день назад
what a cool solution! Had fun watching1
@dionmokhtari3602
@dionmokhtari3602 11 месяцев назад
Such an intuitive solution! Thanks!
@varunshrivastava2706
@varunshrivastava2706 2 года назад
I am always able to draw the decision tree for DP/recursive problems but am never able to convert it to code executable logic!!
@techbarikcom
@techbarikcom 2 года назад
You should practice more on implementation
@varunshrivastava2706
@varunshrivastava2706 2 года назад
@@techbarikcom yeah man you are right
@aritralahiri8321
@aritralahiri8321 2 года назад
Brilliant Explanation ! Please keep making more videos like this . Thanks
@inFamous16
@inFamous16 2 года назад
class Solution { public: int minimumTotal(vector& triangle) { int n = triangle.size(); for(int i=n-2; i>=0; i--){ int m = triangle[i].size(); for(int j=0; j initially we have considered last row as leafs it-0: trriangle[3] = [4, 1, 8, 3] Now, start traversing triangle from 2nd last row to the top: it-1: triangle[2] = [7, 6, 10] it-2: triangle[1] = [9, 10] it-3: triangle[0] = [11] // final iteration storing our result at triangle[0] */
@vdyb745
@vdyb745 2 года назад
Your visuals are unparalleled !!
@vijethkashyap151
@vijethkashyap151 Месяц назад
One of my fav videos!
@mingjunma293
@mingjunma293 3 года назад
why from the bottom to the top? why not from the top to bottom? thx~
@amegahed94
@amegahed94 Год назад
This solution is genius! Nice work.
@xingyuxiang1637
@xingyuxiang1637 11 месяцев назад
Can you comment a little on the input size?
@mathsky4401
@mathsky4401 2 года назад
After your explanation , this problem is butter
@nikunjdeeep
@nikunjdeeep 3 дня назад
I solved this in Time taken: 16 m 3 s is it normal(easy) or i am in right track of learning
@neetinair_2127
@neetinair_2127 3 года назад
Thank you for such a clear explanation!
@tasneemwahdan3618
@tasneemwahdan3618 2 года назад
best explanation ever! Thank you
@romo119
@romo119 Год назад
Can you just start out with dp[] = last row and iterate from the second to last row up to the first?
@rc0698
@rc0698 Год назад
why the time complexity is O(n) not O(n^2)?
@abrahamlincoln5724
@abrahamlincoln5724 Год назад
So, I have IQ of more than 90, yay! In my opinion, this problem is the easiest of all medium Dynamic Programming problems on LC.
@DenysGarbuz
@DenysGarbuz Месяц назад
Why not to store dp actually in triangle row itself? You gonna reduce unnecessar space usage, this my solution (JAVA): public int minimumTotal(List triangle) { for (int row = triangle.size()-2; row >= 0; row--){ List currRow = triangle.get(row); List prevRow = triangle.get(row+1); for ( int i = 0; i < currRow.size(); i++){ currRow.set(i, currRow.get(i) + Math.min(prevRow.get(i), prevRow.get(i+1))); } } return triangle.get(0).get(0); }
@sharad_dutta
@sharad_dutta 2 года назад
You made a mistake when explaining your intuition at 14:09, when you replaced 8 with 12, but should have been 7 i.e. (4 + min(8, 3)). Not something big but just telling FYI. Thanks for all the content
@tiyaaaa3917
@tiyaaaa3917 Год назад
you are right
@sharad_dutta
@sharad_dutta Год назад
@@tiyaaaa3917 haha
@TheElementFive
@TheElementFive 2 года назад
This might be my favorite DP problem
@NeetCode
@NeetCode 2 года назад
I definitely think it's underrated!
@insideout3795
@insideout3795 Год назад
INPLACE SOLUTION, YOU CAN CHOOSE NOT TO USE THE EXTRA TABLE IF WANT TO. THANK YOU. ``` class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: if not triangle: return 0 for row in range(len(triangle)-2, -1, -1): for index, value in enumerate(triangle[row]): triangle[row][index] = value + min(triangle[row+1][index], triangle[row+1][index+1]) return triangle[0][0] ```
@ygwg6145
@ygwg6145 Год назад
Time complexity is O(n)
@mble
@mble 2 года назад
I love your channel, and your videos
@rohanpota5919
@rohanpota5919 2 года назад
Just a word of advice, not include dynamic programming in the title or hash tag, it's kind of a spoiler for many viewers who are attempting to solve the question first before watching your videos.
@lucaswang8457
@lucaswang8457 2 года назад
You are a legend indeed!!!!!!!
@sumeetbisen9708
@sumeetbisen9708 3 года назад
I am new at dp, I somehow manage to write the code but have trouble with memoization, can anyone help with this code? def total(i, row, count): if i>=len(triangle[row]): return float("inf") count+=triangle[row][i] if row==len(triangle)-1: return count return min(total(i, row+1, count), total(i+1, row+1, count)) return min(total(0, 1, count), total(1,1,count))
@VY-zt3ph
@VY-zt3ph Год назад
LOoks like I have IQ less than 90.
@Chris-qb6lb
@Chris-qb6lb 4 месяца назад
I solved this problem before looking at this video so I'm glad my IQ of >= 90 is confirmed.
@ccindy951357
@ccindy951357 8 месяцев назад
謝謝!
@nientranai1669
@nientranai1669 2 года назад
thank you that really helps
@NeetCode
@NeetCode 2 года назад
Glad it helped!
@ANANDKUMAR-nc1jh
@ANANDKUMAR-nc1jh 2 года назад
You are the best
@hhjdkdnchidnd
@hhjdkdnchidnd 2 года назад
my IQ definitely below the 90
@rishabhverma3615
@rishabhverma3615 2 года назад
Can someone tell me when tu enumerate and when not to?
@zactamzhermin1434
@zactamzhermin1434 2 года назад
Both works. Enumerating is just a shorter way to write code so you can: 1. Avoid writing range(len(array)) 2. Avoid writing array[idx] to get the item at the current `idx` index If you are not comfortable with enumerate yet just avoid it for now and use in range len. It does the exact same thing. ```python # slightly shorter enumerate code for idx, num in enumerate(array): ... # this is equivalent to above for loop for idx in range(len(array)): num = array[idx] ... ```
@Philgob
@Philgob 29 дней назад
LET'S GO ANSWERED WITHOUT SOLUTION
@VarunMittal-viralmutant
@VarunMittal-viralmutant 2 года назад
If someone(like me) wants to start from 1 row and go all the way to the last: def min_path_sum(triangle): dp = [float('inf')] * len(triangle[-1]) dp[0] = triangle[0][0] for row in triangle[1:]: for index, element in reversed(list(enumerate(row))): if index != 0: dp[index] = element + min(dp[index], dp[index-1]) else: dp[index] = element + dp[0] return min(dp)
@manjeetsingh6028
@manjeetsingh6028 2 месяца назад
awesome
@lali.p7951
@lali.p7951 2 года назад
WOW 🤩 now I am feeling like I have 130 IQ 😎
@chiamakabrowneyes
@chiamakabrowneyes 11 месяцев назад
me watching this knowing that I have an IQ of float("-inf")
@yagedygag
@yagedygag 3 года назад
Great video, nice clickbait haha How did you learn data structures and algorithms?
@harrywang9375
@harrywang9375 2 года назад
This sounds like a tree with extra steps
@leonardlim4145
@leonardlim4145 8 месяцев назад
Hahaha i have an iq of 136 ;) can solve this lolz
@pironobcoding
@pironobcoding 2 года назад
my iq 😥
Далее
How to Solve ANY LeetCode Problem (Step-by-Step)
12:37
Просмотров 217 тыс.
Добрая весть 😂
00:21
Просмотров 549 тыс.
У НАС ДОМА ЗАВЕЛАСЬ КРЫСА 🐀
01:00
Unique Paths II - Leetcode 63 - Python
14:31
Просмотров 16 тыс.
I gave 127 interviews. Top 5 Algorithms they asked me.
8:36
Intro to Competitive Programming
11:41
Просмотров 776 тыс.
5 Useful F-String Tricks In Python
10:02
Просмотров 306 тыс.
Добрая весть 😂
00:21
Просмотров 549 тыс.