Burst Baloons - Dynamic Programming - Leetcode 312 - Python

Sdílet
Vložit
  • čas přidán 23. 07. 2024
  • 🚀 neetcode.io/ - A better way to prepare for Coding Interviews
    🐦 Twitter: / neetcode1
    🥷 Discord: / discord
    🐮 Support the channel: / neetcode
    💡 CODING SOLUTIONS: • Coding Interview Solut...
    💡 DYNAMIC PROGRAMMING PLAYLIST: • House Robber - Leetco...
    🌲 TREE PLAYLIST: • Invert Binary Tree - D...
    💡 GRAPH PLAYLIST: • Course Schedule - Grap...
    💡 BACKTRACKING PLAYLIST: • Word Search - Backtrac...
    💡 LINKED LIST PLAYLIST: • Reverse Linked List - ...
    Problem Link: neetcode.io/problems/burst-ba...
    0:00 - Read the problem
    4:13 - Intuition
    13:15 - Drawing Explanation
    16:55 - Coding Explanation
    leetcode 312
    This question was identified as an interview question from here: github.com/xizhengszhang/Leet...
    #burst #baloons #python
    Disclosure: Some of the links above may be affiliate links, from which I may earn a small commission.
  • Věda a technologie

Komentáře • 115

  • @NeetCode
    @NeetCode  Před 3 lety +3

    💡 DP Playlist: czcams.com/video/73r3KWiEvyk/video.html

  • @ClaudioCarvalhoo
    @ClaudioCarvalhoo Před 3 lety +83

    Just wanted to say that your videos are the best Leetcode question explanations on CZcams by a long shot in my opinion.
    Thanks and keep going!

  • @sarthuaksharma9609
    @sarthuaksharma9609 Před 3 lety +26

    I was stuck on this problem for hours. Going through the discuss forum but was not able to get the feel on how to approach and I thought let's see if Neetcode has this. Thank you so much man.
    One suggestion though if you encounter similar problems It will be really helpful if you can put those in the description. Keep up the good work man

  • @jyotioh3723
    @jyotioh3723 Před rokem +20

    I hope no one gets discouraged while trying to get through this one. I'm almost there, lmao.

    • @Hiroki-Takahashi
      @Hiroki-Takahashi Před 3 měsíci +4

      I was being so discourged while watching this video lol (I mean, NeetCode's explanation was excellent. This problem is just god damn hard)

  • @wintersol9921
    @wintersol9921 Před 2 lety +4

    So glad to find this video. I have been trying to understand how to solve this problem for 2 days. You explained it in 10 minutes. Thank you very much.

  • @numberonep5404
    @numberonep5404 Před 2 lety +13

    The backtracking solution with some kinda cache is easy to code if you know how to code permutations, but omfg i could never have guessed the tricks on this one by myself, and even less in an interview setting, thanks a lot for the explanation! Here is an iterative bottom up solution that worked for me at 66% faster:
    class Solution:
    def maxCoins(self, nums: List[int]) -> int:
    nums = [1]+nums+[1]
    dp = [[0 for r in range(len(nums))] for l in range(len(nums))]
    for l in range(len(nums)-2,0,-1):
    for r in range(1,len(nums)-1):
    if l

  • @tabeebyeamin9986
    @tabeebyeamin9986 Před 3 lety +14

    Yes, this code passes 69/70 cases and TLEs on the last one. But it seems you can't do better than O(n^3) anyway, so I am going to use this solution if I get it an interview.
    I spent 45 minutes attempting this myself and the best I could do was the glorious 2^n bruteforce solution lol.
    I love that you keep it real and mention you have no idea how we would be able to solve it without seeing it

    • @vinayak186f3
      @vinayak186f3 Před 3 lety

      Can I have that 2^n solution please .

    • @saiachyuth3460
      @saiachyuth3460 Před 2 lety

      @@vinayak186f3 It's the same solution without dp

    • @MrPanthershah
      @MrPanthershah Před 2 lety +8

      Bruteforce isn't 2^n, it's n^n, I think that's what you meant.

    • @nlke182
      @nlke182 Před rokem

      If you use @cache decorator it can pass.

    • @CaradhrasAiguo49
      @CaradhrasAiguo49 Před rokem

      @@MrPanthershah Brute force would be to generate all permutations, which is N!, which is asymptomatically less than N^N per Stirling's formula

  • @secretdev1559
    @secretdev1559 Před 2 lety +3

    Awesome explanation! There are a few more cases that were added to LC which lead to a TLE despite the same num check. If one takes the DFS approach here and instead leverages iteration, the overhead of the stack can be avoided and a TLE can be avoided. Although the algorithm's RT is still O(n^3) with O(n^2) space complexity. I think that the time limit band on the problem needs to be increased.

  • @MAhmadian
    @MAhmadian Před 2 lety +11

    Thank you for clever solution awesome explanation. It throws an TLE which can be fixed by handling the special case which all elements in the list are the same number.
    if len(nums) > 1 and len(set(nums)) == 1:
    return (nums[0] ** 3) * (len(nums) - 2) + nums[0] ** 2 + nums[0]

    • @sergeychepurnov1328
      @sergeychepurnov1328 Před 2 lety +1

      I think it ugly, but works for Leetcode's last test case that I believe doesn't needed at interview:
      //one special test case handled manually
      //check roughly
      if (nums.length > 10 && nums[0] == nums[1] && nums[1] == nums[2]) {
      Set set = new HashSet();
      for (int num : nums) {
      set.add(num);
      }
      //check exactly
      if (set.size() == 1) {
      int num = nums[0];
      // 1 100 100 100 ... 100 100 100 1 - calculate all middle values: (num*num*num)*(nums.length - 2)
      // 1 100 100 1 - calculate 2 last: num*num
      // 1 100 1 - calculate 1 last: num
      int max = (num*num*num)*(nums.length - 2) + num*num + num;
      return max;
      }
      }

    • @ayeshsalah
      @ayeshsalah Před 2 lety

      Could please explain why this works ?

    • @dollyvishwakarma2
      @dollyvishwakarma2 Před 2 lety +1

      this did not work for me

  • @bmusuko
    @bmusuko Před 2 lety +8

    if you guys got TLE on the last testcase, try to change dp hashmap into 2d matrix, since array lookup slightly faster than hashmap lookup. And also you can put `@cache` on top of dfs function

  • @vinayakmikkal
    @vinayakmikkal Před 2 lety +1

    What if the array is [3, 1, 5, 8, 2] and the order of popping is [1, 8, 3, 2, 5] so at the end the cost that needs to be calculated is 3*5*2 + other_part, I'm not able to see a situation where the multiplication of 3*5*2 taking place. Am I missing anything?

  • @ahmedrebei8138
    @ahmedrebei8138 Před 2 lety +19

    3:58 I think the complexity would be n! (you get one less item on each level of the tree)

    • @vijayola7597
      @vijayola7597 Před 2 lety

      yes

    • @sk_4142
      @sk_4142 Před 11 měsíci

      yes, that solution basically generates all the permutations, which is n!

  • @SreyesSrinivasan
    @SreyesSrinivasan Před rokem

    Fantastic explanation man! Keep up the great work

  • @chuckchen2851
    @chuckchen2851 Před 3 lety +10

    Tried the lru_cache and the manual memoization way as done in the video, both TLE on the 69th case, which has 500 elements. Is the bottom-up approach somehow more efficient than the top-down?

    • @nathanx.675
      @nathanx.675 Před 2 lety

      Same...

    • @8Trails50
      @8Trails50 Před 2 lety +1

      it is more efficient - less overhead in computation which leads to it barely being accepted.

    • @jongxina3595
      @jongxina3595 Před rokem

      I did it bottom up and worked like a charm first try ✨️

  • @farleylai1102
    @farleylai1102 Před rokem +5

    Solution to TLE:
    1. Iterative
    2. Use matrix instead of hash map cache
    def maxCoins(self, nums: List[int]) -> int:
    from collections import Counter
    nums = [1] + nums + [1]
    dp = [[0] * len(nums) for _ in range(len(nums))]
    for L in range(len(nums) - 2, 0, -1):
    for R in range(L, len(nums) - 1):
    for i in range(L, R+1):
    coins = nums[L-1] * nums[i] * nums[R+1]
    coins += dp[L][i-1] + dp[i+1][R]
    dp[L][R] = max(dp[L][R], coins)
    return dp[1][len(nums) - 2]

    • @ShamsNahid-gc1cx
      @ShamsNahid-gc1cx Před měsícem

      Specially, in JS, without 2d matrix cache, it got a TLE.
      Thanks

  • @VishalKumar-kr9me
    @VishalKumar-kr9me Před 11 měsíci

    What made you to not check l == r instead go with l > r as the base condition?
    Could you please explain

  • @Rohan-hj9gg
    @Rohan-hj9gg Před 3 lety +5

    Thanks for this, can we have video for palindrome partitioning (MCM variation)

  • @MrKB_SSJ2
    @MrKB_SSJ2 Před 9 měsíci

    I watch every LeetCode video of yours!

  • @ammarqureshi2155
    @ammarqureshi2155 Před 2 lety +1

    great explanation, keep it up mate :)

  • @nathanx.675
    @nathanx.675 Před 2 lety

    This is brilliant!

  • @linli7049
    @linli7049 Před 3 lety

    Awesome solution!

  • @snowboarder981
    @snowboarder981 Před 3 měsíci

    I really appreciate the work you put into these videos. Your videos are easily the best explanations. I love that you draw things out and talk about multiple solutions before moving to the code. You are best my friend!

  • @helloadventureworld
    @helloadventureworld Před 26 dny

    thanks for the video on this one
    it wasn't an easy one to get to be honest and your explanation made it way easier on me ❤❤❤❤

  • @tomtran6936
    @tomtran6936 Před 2 lety

    Wow. Really awesome trick and thought process. Nice explanation. Appreciated!. If you don't mind to share how much time you took to figure out of this solution?

  • @albertjtyeh53
    @albertjtyeh53 Před 2 lety +5

    It's TLE-ing on the 69/70th case now

  • @omartahboub2900
    @omartahboub2900 Před 2 lety +3

    Good Point !
    If your interviewer was so busy that day and had bunch of deliverable to be completed, and forgot to give you any useful hints and poor candidate who prepped for so many sleepless weeks to eventually be marked with "No Hire" for such problem the candidate would not encounter working at that company. What a sad reality ! I would imagine many candidates would just memorize the solution and go with odds of "Hit or Miss" until the next 6 or 12-month cool-down cycle.

    • @VarunMittal-viralmutant
      @VarunMittal-viralmutant Před 2 lety +6

      I have seen architect level ppl stuck on a problem for weeks, and then when they have 'light bulb' moment, they ask the same question in their next interview. Imagine the poor candidate has just 40 minute to crack the question 😢

    • @igorborovkov7011
      @igorborovkov7011 Před 9 měsíci

      @@VarunMittal-viralmutant that's a bar raiser

    • @VarunMittal-viralmutant
      @VarunMittal-viralmutant Před 9 měsíci

      @@igorborovkov7011 No matter what you call it. It is unfair and unjust to the candidate. While you were stuck for it for weeks and had multiple ppl brainstorming the solution, the poor candidate is all alone, already under pressure and has just 30 minute to come up with the solution.

  • @hwang1607
    @hwang1607 Před 3 měsíci +1

    This is a crazy question

  • @sapnavats9105
    @sapnavats9105 Před 2 lety +2

    What is the need to initialize dp[(l,r)] to 0 and then update it as max of 0 and the newly computed value?

    • @chessingh
      @chessingh Před 2 lety

      because dp is a dictionary and it will give key error, if not already there in the dictionary, try it without initialization you will see

    • @DavidDLee
      @DavidDLee Před rokem +1

      The reason for initializing to 0 in L12 and then taking the max at L16 is because the code iterates over all nums between [l, r] and finds the max at that range. Now, you must find the max in [l, r], otherwise you'd get the wrong answer (*NOT* a key error though), because you'd probably just take the last value in the range that is likely less than max.
      Initializing to 0 in L12 is just a convenience, so you could use max also on the first iteration. 0 is guaranteed to be less than any of the possible values.

  • @ashwinnema06
    @ashwinnema06 Před 2 lety +3

    Best explanation I ever found on youtube

  • @sheltonsong6120
    @sheltonsong6120 Před 2 lety +2

    Thanks for the solution!!! You are the best! I copy paste your solution to Leetcode, and the judge result is Time Limit Exceeded. I believe the solution is definitely correct though, have you tried to submit the results? Leetcode sucks!

  • @wintersol9921
    @wintersol9921 Před 2 lety

    Does anyone else get Time Limit Exceeded error when submitting it?

  • @houmankamali5617
    @houmankamali5617 Před rokem +1

    If it helps, the way that I justified one could intuitively arrive at the trick is to think about how we could arrive at a subproblem in which the order of the elements is the original list is not modified. The initial approach of starting from popping an element and then calculating the result for the subproblems does not work because the order of the elements in the subproblems are different than the original problem, so we can instead think "how would it help me find a solution if I had the cache result for some consecutive number of the elements?"

    • @stevenmo1586
      @stevenmo1586 Před rokem +1

      great insight Houman!

    • @harimonting01
      @harimonting01 Před 3 měsíci

      But before deciding to look for possible subproblem, how can we intuitively conclude that this is a dp problem?

  • @akshay-kumar-007
    @akshay-kumar-007 Před rokem

    This looks like a variation of MCM. Is my intuition correct?

  • @samarthtandale9121
    @samarthtandale9121 Před 11 měsíci

    I think the time complexity of brute force will be n! Right?

  • @syeds6789
    @syeds6789 Před 3 lety

    Thanks 😊

  • @user-th8dr3iu5g
    @user-th8dr3iu5g Před 2 lety

    Sooo clean

  • @forresthu6204
    @forresthu6204 Před 2 lety +1

    Thanks

  • @venkatarakesh1698
    @venkatarakesh1698 Před 2 lety

    Good explanation

  • @chenzhuo9
    @chenzhuo9 Před 3 lety +6

    I got TLE with the same code rip

  • @ameynaik2743
    @ameynaik2743 Před 2 lety +2

    Is there a list of problems on leetcode which fall under this category?

  • @kashishsharma6809
    @kashishsharma6809 Před 2 lety

    oh god! such a hard ques. still don't know how will this recursive func will cover all the cases.

  • @mahedihassanrabby9553
    @mahedihassanrabby9553 Před 8 měsíci

    Best of the best❤

  • @user-lv2lm4wh6d
    @user-lv2lm4wh6d Před 8 měsíci

    why the range is r+1 in L13???

  • @hanjiang9888
    @hanjiang9888 Před 2 lety

    it works with python 2 but not python 3 on leetcode. Does anyone meet the same problem?

  • @mohakparekh8671
    @mohakparekh8671 Před 11 měsíci

    Excellent explanation!
    There is one part which I am not able to comprehend. Why can't we use the caching with subsequence? There are 2^n subsequences, but won't the caching of that subproblems help us?

  • @sagarpotnis1215
    @sagarpotnis1215 Před rokem

    there should be a counter for the time neetcode said "pop" in this video 😂

  • @veeresh4441
    @veeresh4441 Před 2 lety +3

    fck, there is no way I could think this in an interview

    • @NeetCode
      @NeetCode  Před 2 lety +3

      me neither probably, im sure 90% of interviewers would give you a hint tho.

    • @BeheadedKamikaze
      @BeheadedKamikaze Před 2 lety

      @@NeetCode Would you mind explaining how you did arrive at this solution? It's not exactly intuitive.
      Edit: in case it wasn't clear, I do understand why it works. Just wondering by what process you managed to think of doing this.

  • @itachid
    @itachid Před rokem

    I think there's a mistake at 5:58 when Neet tells that for an array of size N there can be at most N^2 subarrays. But aren't there actually (N * (N + 1)) / 2 subarrays for an array of size N?

    • @user-dl1jb5vz6x
      @user-dl1jb5vz6x Před rokem

      Well, we don't really care about the specific constants and thereby it is O(N^2) subarrays.

  • @chowtuk
    @chowtuk Před rokem +1

    the most unsatisfying video from neetcode

  • @dk20can86
    @dk20can86 Před 2 lety

    This one nearly killed me 😮‍💨

  • @MuratJumashev
    @MuratJumashev Před rokem +1

    A possible follow-up question: give me the list of balloons you popped to get these coins 😅 Haven't solved this follow-up myself yet. Whenever I get to the solution, I think I'll have a better understanding of this problem 💪

  • @sauravgupta7415
    @sauravgupta7415 Před rokem +1

    Your voice is sounds like "Hello everyone, this is your daily dose of internet"

  • @gauravchauhan7412
    @gauravchauhan7412 Před 2 lety +1

    best video

  • @dataman4503
    @dataman4503 Před 2 lety +3

    I would assume that the interviewer wanted to fail you if they ask you this question in interview.

  • @derekmiller9520
    @derekmiller9520 Před 11 měsíci

    Wouldn't brute force be O(n!) complexity?

  • @chowtuk
    @chowtuk Před rokem

    It would be better to understand if this video is like others DP video which draw a grash to run the solution's algorithm , because this is quiet complex to understand, hard to implement how it actually run in my brain

  • @jonaskhanwald566
    @jonaskhanwald566 Před 3 lety +2

    MAXIMUM PROFIT IN JOB SCHEDULING?

  • @TankNSSpank
    @TankNSSpank Před 2 lety

    genius

  • @Randomisticful
    @Randomisticful Před 2 lety +1

    I wish there were Java solutions using "proper English". But still, this does the job. Thanks!

  • @Super111111111111Man
    @Super111111111111Man Před 11 měsíci

    Still not understand, help!

  • @milseq
    @milseq Před 5 měsíci +1

    This is one of those problems where I'm just going to hope I don't get it.

  • @arnabpersonal6729
    @arnabpersonal6729 Před 3 lety +1

    very good approach but giving TLE

  • @nardindev
    @nardindev Před 2 měsíci

    i did it in js like this
    function maxCoins(nums) {
    const n = nums.length;
    const dp = Array(n + 2).fill(0).map(() => Array(n + 2).fill(0));
    const balloons = [1, ...nums, 1];
    for (let len = 1; len

  • @sushantrocks
    @sushantrocks Před 2 lety +1

    Smells like matrix chain mult

  • @user-ul9rs2ge7x
    @user-ul9rs2ge7x Před měsícem

    A moment of silence for those who got this question in an interview (bonus points for it being the first)

  • @Rohan-hj9gg
    @Rohan-hj9gg Před 3 lety

    The solution does not work for the last test case.

  • @m.y.7230
    @m.y.7230 Před měsícem

    Matrix Chain Multiplication would be easier approach

  • @rackstar2
    @rackstar2 Před rokem +1

    this just throws a type error

  • @abhayphanse9509
    @abhayphanse9509 Před 6 měsíci

    classic IT IS WHAT IT IZ problem

  • @joydeeprony89
    @joydeeprony89 Před rokem

    YOU ARE SUPER HUMAN, SAME AS MESSI IN FOOTBALL. THANKS FOR MAKING OUR LIFE EASIER SPECIALLY DEV LIKE ME WHO IS BELOW AVERAGE BUT HAVING AN AMBITION OF WORKING FOR TIER ONE PRODUCT COMPANY.

  • @shouryansharma9441
    @shouryansharma9441 Před 2 lety

    This solution is getting TLE

  • @fdm6334
    @fdm6334 Před rokem

    This solution gives TLE now.

  • @joshithmurthy6209
    @joshithmurthy6209 Před rokem

    Most crip explaination on youtube

  • @dataman4503
    @dataman4503 Před 2 lety

    Meticulous explanation...

  • @shrn
    @shrn Před 6 měsíci

    Why is the solution so simple?

  • @rhapsody9442
    @rhapsody9442 Před rokem

    For those who get a TLE, try to add a @lru_cache(None) before the dfs function. Though this may be opportunistic, but it does work for me :) Got this from a leetcode discuss but I cannot understand that solution. This neet solution is within my understanding.

  • @Mnogarithm
    @Mnogarithm Před 8 měsíci +1

  • @ChinmayAnaokar-xm4ci
    @ChinmayAnaokar-xm4ci Před rokem

    C# Implementation of above code with all test cases passed
    public class Solution
    {
    public int MaxCoins(int[] nums)
    {
    List lst = nums.ToList();
    lst.Insert(0, 1);
    lst.Insert(lst.Count, 1);
    int count = lst.Count;
    int[,] dp = new int[count, count];
    return DFS(1,lst.Count-2,dp,lst);
    }
    private int DFS(int l,int r,int [,] dp,Listnums)
    {
    if (l > r)
    return 0;
    if (dp[l, r] != 0)
    return dp[l, r];
    dp[l, r] = 0;
    for(int i=l;i< r+1;i++)
    {
    int coins = nums[l - 1] * nums[i] * nums[r + 1];
    coins = coins + DFS(l, i - 1, dp, nums) + DFS(i+1, r, dp, nums);
    dp[l, r] = Math.Max(dp[l, r], coins);
    }
    return dp[l, r];
    }
    }

  • @shaamidrees6036
    @shaamidrees6036 Před 2 lety

    Thanks