House Robber III - Tree - Leetcode 337

Sdílet
Vložit
  • čas přidán 9. 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...
    Linked List Playlist: • Reverse Linked List - ...
    Problem Link: leetcode.com/problems/house-r...
    0:00 - Read the problem
    1:45 - Drawing Explanation
    13:55 - Coding Solution
    leetcode 337
    This question was identified as a google interview question from here: github.com/xizhengszhang/Leet...
    #house #robber #python
  • Věda a technologie

Komentáře • 83

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

    🌲 Tree Playlist: czcams.com/video/OnSn2XEQ4MY/video.html

  • @alokesh985
    @alokesh985 Před 2 lety +15

    Out of all the leetcode solutions on CZcams, you write the cleanest, most understandable code. Please keep up the excellent work

  • @prithulbahukhandi1714
    @prithulbahukhandi1714 Před 3 lety +31

    Not everyone has the ability to teach brother you have it. keep enlightening us. !!

  • @ArvindKonda
    @ArvindKonda Před 2 lety

    Love it ! Elegant and the way you write your code with few lines at the bottom , few lines in the middle like finishing a puzzle. It's beautiful.

  • @raghavendharreddydarpally2125

    your way of solving problem especially building from scratch and your explanation is very clear and good .please do more videos on most solved leetcode problems.

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

    Thanks so much! Ur videos have been helped me a lot. #1 channel on my list for leetcode study. Looking forward to see more of your videos!

  • @VY-zt3ph
    @VY-zt3ph Před rokem +1

    This playlist is absolute gold. Don't know what I will expect in DP and Graphs.

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

    Im dying at the corresponding number of Macauley Culkins in your House Robber series thumbnails, its just *chefs kiss*

  • @lizgarcia4626
    @lizgarcia4626 Před 10 měsíci

    It is incredible how comprehensible and organized your explanations and solutions are. Thank you so much!

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

    Very Nice and Simplified explanation . Really appreciate your work.

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

    I really think whoever proposes this problem is definitely a genius! Such a problem with dfs, binary tree and dp, what a combination!

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

    Beautifully explained. Thanks!

  • @tonymontana9221
    @tonymontana9221 Před 4 měsíci

    I just want to add a comment for people who might not understand thoroughly. We are not simply skipping child nodes and reaching grandchild nodes. The max() here means we are carried over the largest value of the subtree with the grandchild node as the root for each grant child root. That is amazing. Thank a ton

  • @shuhaoliang144
    @shuhaoliang144 Před 2 lety

    I feel that this problem requires the combination of Dynamic Programming and DFS (Recursion), and you explained this problem very clearly. Even though I am using Java and you are using Python, I followed your logic and did this problem correctly. Thank you very much for your fantastic teaching and explanation!

  • @yinglll7411
    @yinglll7411 Před 2 lety

    Thank you for the great explanation!

  • @aayush9080
    @aayush9080 Před rokem

    Great Explaination. Loved it. Have been watching your videos for the past 2 months. This explaination forced me to do away with my laziness and comment.

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

    Dude, this is some rockstar level content really. I can’t tell how grateful I’m and how motivating these are! Thanks a lot!

  • @s.z.7938
    @s.z.7938 Před 2 lety

    Amazing, really helpful, thank you!!!

  • @ambarishdashora5440
    @ambarishdashora5440 Před 2 lety

    thank you so much bro. You gave an excellent explanation.

  • @ananya___1625
    @ananya___1625 Před 2 lety

    Great explanation!!!

  • @skylyyun
    @skylyyun Před 10 měsíci

    Thanks! very great explanation!

  • @arenmkhoyan
    @arenmkhoyan Před 7 měsíci +1

    Very nice, thanks

  • @ritikkhatri
    @ritikkhatri Před 2 lety

    such clear explanation

  • @shivambaghel9668
    @shivambaghel9668 Před 2 lety

    I start watching your channel when it was at 90k and now it's 95k ,(in approx. 1 month) ..Congratulation

  • @hoanganhtu9090
    @hoanganhtu9090 Před 3 lety

    great explaination

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

    I did it using bfs, borrowing from the solution to House Robber II
    from collections import deque
    class Solution:
    def rob(self, root) -> int:
    def bfs():
    rob1, rob2 = 0, 0
    queue = deque()
    queue.append(root)
    while queue:
    n = 0
    for i in range(len(queue)): # level order
    node = queue.popleft()
    n += node.val
    if node.left: queue.append(node.left)
    if node.right: queue.append(node.right)
    temp = max(rob1 + n, rob2)
    rob1 = rob2
    rob2 = temp
    return rob2
    return bfs()

  • @SairamDasari2000
    @SairamDasari2000 Před 5 měsíci

    Are you fr? I thought I couldn't solve this problem until I saw your explanation. Thanks for making an impact 🙌

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

    Thank you very much! This was really good

  • @___vandanagupta___
    @___vandanagupta___ Před rokem

    Very well explained!!! .

  • @annoyingorange90
    @annoyingorange90 Před rokem

    BEAUTIFUL SOLUTION

  • @anthonyuccello1458
    @anthonyuccello1458 Před 2 lety

    This channel is the real leetcode premium

  • @thanirmalai
    @thanirmalai Před 14 dny

    Amazing solution

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

    Bfs, store sum at each level and then just find max using alternate cells (0,2,4,...) (1,3,5,...). O(n) mem and O(n) time.

    • @prathamj2215
      @prathamj2215 Před 2 lety

      This is what I thought as well

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

      This won't work for something like [2, 1, 3, null, 4]. Answer should be 7. This approach will return 6

    • @sushantrocks
      @sushantrocks Před 2 lety

      @@alokesh985 nice one

  • @nikhilchauhan5837
    @nikhilchauhan5837 Před 3 lety

    Awesome content. can you cover some segment tree problems in future videos

  • @andreytamelo1183
    @andreytamelo1183 Před 2 lety

    Thanks!

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

    I tried level order traversal and built an array list and then ran house robber 1 approach but it did not solve the edge cases.
    I hope one day I would be able to solve the way you do it!.
    Would you be able to explain what was your thought process to come to this solution

  • @adityarathi3420
    @adityarathi3420 Před 2 lety

    Thanks you sir! :-)

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

    U a God

  • @BarneyBing883
    @BarneyBing883 Před 2 lety

    I was asked this question in an interview and I failed and I thought that it would use some complex data structure and algorithm, but your video proved me wrong! 😂 But honestly, thank you so much for explaining this!

  • @anshhchaturvedi1155
    @anshhchaturvedi1155 Před rokem

    This approach is giving TLE in C++

    • @anshhchaturvedi1155
      @anshhchaturvedi1155 Před rokem

      Here's the code
      class Solution {
      public:
      pair help(TreeNode* root)
      {
      if(!root) return {0,0};
      if(!root->left && !root->right) return{root->val,0};
      return {root->val+help(root->left).second+help(root->right).second,(max(help(root->left).first,help(root->left).second)+max(help(root->right).first,help(root->right).second))};
      }
      int rob(TreeNode* root)
      {
      return max(help(root).first,help(root).second);
      }
      };
      It'd be great if someone could help

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

    I tried using House Robber I + BFS for this problem
    one, two = 0, 0
    queue = [root]
    while queue ->
    num = 0
    for _ in queue ->
    node = queue.popleft()
    queue.push(node.left)
    queue.push(node.right)
    num += node.data
    one, two = two, max(one + num, two)
    return two

  • @shaharrefaelshoshany9442

    the most perfect ever.

  • @ladanafar5917
    @ladanafar5917 Před 3 lety

    Please can you increase the frequency i.e can you do more questions?

  • @ajinkya-wasnik
    @ajinkya-wasnik Před 9 měsíci

    beautiful

  • @laplacesdemon8140
    @laplacesdemon8140 Před 3 lety

    OMG ! genius

  • @zacyou4220
    @zacyou4220 Před rokem

    what will be the time complexity and space complexity of this algo?

  • @joydeeprony89
    @joydeeprony89 Před rokem

    Smooth like Vaseline.

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

    Will this solution be enough in an interview

  • @sangamsamdarshi4634
    @sangamsamdarshi4634 Před rokem

    recursion makes problems easy af

  • @WowPlusWow
    @WowPlusWow Před 3 lety

    🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

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

    Nice thumbnail

  • @SmoothCode
    @SmoothCode Před 2 lety

    what does leftPair[1] and rightPair[1] even mean? The left most left node at the end of the binary tree?

    • @rohithv63
      @rohithv63 Před 2 lety

      it represents the maximum score the robber can get if he decides not to rob the root node

  • @danielsun716
    @danielsun716 Před 2 lety

    one question: when should we build a new nested funtion?

    • @jorgemejia1586
      @jorgemejia1586 Před rokem

      when you wanna pass a parameter that isn't given by the parent function

    • @danielsun716
      @danielsun716 Před rokem

      @@jorgemejia1586 But why can't we just set an variable, why should use a function?
      like we can just set n = 0 to change n
      why should we do it like def dfs(n) to change n?

  • @midhileshmomidi3120
    @midhileshmomidi3120 Před rokem

    For this input [2,1,3,null,4] ans is given as 7. Isn't it 6
    tree : 2
    1 3
    4

  • @kwaminaessuahmensah8920

    god right here people

  • @binit1992
    @binit1992 Před rokem

    Can we solve it using BFS ?

  • @midhileshmomidi3120
    @midhileshmomidi3120 Před rokem

    Can we do level order traversal on this

    • @sindhu5840
      @sindhu5840 Před rokem

      for a skewed tree, level order traversal might not work. eg. 4 - 1 - 2 - 3 . level order will retun max 6 (4+2). but the robber can rob 4 and 3 and make a profit of 7

  • @jorgemejia1586
    @jorgemejia1586 Před rokem

    bro i thought you could use bfs on this one

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

    Picasso 🤏🤏

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

    Is it possible to solve this in an interview without coming across it even once? 🧐

  • @skmdmobinulislam3904
    @skmdmobinulislam3904 Před 2 lety

    when a teacher unlocks his god-level mode 🤯

  • @coldstone87
    @coldstone87 Před 2 lety

    why cant you chose 4 and 100? They aren't directly connected. This is an ambigious question with no solution and you just wrote a solution of your own version of question.

  • @dhiwakarna8509
    @dhiwakarna8509 Před rokem

    Why are we helping the thief?

  • @nikhilgoyal007
    @nikhilgoyal007 Před rokem

    It did not pass for me. I copied it exactly but does not pass :(
    class Solution:
    def rob(self, root: Optional[TreeNode]) -> int:
    # return pair: [withroot, withoutroot]
    def dfs(root):
    if not root:
    return [0, 0]
    leftPair = dfs(root.left)
    rightPair = dfs(root.left)
    withRoot = root.val + leftPair[1] + rightPair[1]
    withoutRoot = max(leftPair) + max(rightPair)

    return [withRoot, withoutRoot]
    return max(dfs(root))

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

      rightPair = dfs(root.left) this should be
      rightPair = dfs(root.right)

  • @alishan9354
    @alishan9354 Před 2 lety

    please start coding in c++

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

      class Solution {
      public:

      map map ;

      int rob(TreeNode* root) {

      if(not root) return 0 ;

      if(map.count(root)) return map[root] ;

      int withoutRoot = rob(root->left) + rob(root->right) ;
      int withRoot = root->val ;

      if(root->left) withRoot += rob(root->left->left) + rob(root->left->right) ;
      if(root->right) withRoot += rob(root->right->left) + rob(root->right->right) ;


      return map[root] = max(withRoot,withoutRoot) ;

      }
      };

    • @shivanshgupta5657
      @shivanshgupta5657 Před 2 lety

      @@adityarathi3420 Hi , why is memoization needed ??? what is the repeated step here ?

    • @adityarathi3420
      @adityarathi3420 Před 2 lety

      @@shivanshgupta5657 without memoization i will getting tle on leetcode.

    • @shivanshgupta5657
      @shivanshgupta5657 Před 2 lety

      @@adityarathi3420 yeah I got the same but I used to think memoization is applied when we reapeatedly reach a given state in recursion. In this however we will traverse every node for once and there is no repeated state so why is there a need to memoize ? am I missing something ?

  • @milanpanta150
    @milanpanta150 Před rokem

    you are making it more complicated. You also draw too much and say tooooooo much. provide the idea first, then try to explain. This will make sense then. Otherwise, you are just trying to explain without giving how to do it and at last you tell this is the way you do it. That is not helping at all.

  • @akashdey5637
    @akashdey5637 Před měsícem

    why is BFS not working here?
    given below is my code:
    if not root:
    return root
    q = deque([root])
    res = []
    while q:
    val = []
    for i in range(len(q)):
    node = q.popleft()
    val.append(node.val)
    if node.left:
    q.append(node.left)
    if node.right:
    q.append(node.right)
    res.append(val)
    rob1, rob2 = 0, 0
    for i in range(len(res)):
    if not i % 2:
    rob1 += sum(res[i])
    else:
    rob2 += sum(res[i])
    return max(rob1, rob2)