House Robber III - Tree - Leetcode 337

Поділитися
Вставка
  • Опубліковано 17 лис 2024

КОМЕНТАРІ • 91

  • @NeetCode
    @NeetCode  3 роки тому +7

    🌲 Tree Playlist: ua-cam.com/video/OnSn2XEQ4MY/v-deo.html

  • @alokesh985
    @alokesh985 2 роки тому +18

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

  • @prithulbahukhandi1714
    @prithulbahukhandi1714 3 роки тому +35

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

  • @tonymontana9221
    @tonymontana9221 8 місяців тому +1

    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

  • @raghavendharreddydarpally2125
    @raghavendharreddydarpally2125 3 роки тому +7

    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.

  • @ArvindKonda
    @ArvindKonda 2 роки тому +1

    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.

  • @VY-zt3ph
    @VY-zt3ph Рік тому +1

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

  • @boopeshshanmugam3436
    @boopeshshanmugam3436 4 місяці тому

    There is so much work behind the video of choosing the right test cases to give the explanations in the best way. Thanks for your efforts. You rock !

  • @eyou2813
    @eyou2813 3 роки тому +3

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

  • @lizgarcia4626
    @lizgarcia4626 Рік тому +1

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

  • @youlihanshu
    @youlihanshu 2 роки тому +1

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

  • @shuhaoliang144
    @shuhaoliang144 2 роки тому

    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!

  • @aritralahiri8321
    @aritralahiri8321 3 роки тому +1

    Very Nice and Simplified explanation . Really appreciate your work.

  • @ashishm8850
    @ashishm8850 3 роки тому +3

    Beautifully explained. Thanks!

  • @aayush9080
    @aayush9080 Рік тому

    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.

  • @yicheng7712
    @yicheng7712 3 роки тому +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!

  • @MsSkip60
    @MsSkip60 3 роки тому +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!

  • @SairamDasari2000
    @SairamDasari2000 9 місяців тому +1

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

  • @sushantrocks
    @sushantrocks 3 роки тому +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 3 роки тому

      This is what I thought as well

    • @alokesh985
      @alokesh985 2 роки тому +4

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

    • @sushantrocks
      @sushantrocks 2 роки тому

      @@alokesh985 nice one

  • @lonen3rd
    @lonen3rd Рік тому

    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()

  • @shivambaghel9668
    @shivambaghel9668 2 роки тому

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

  • @arenmkhoyan
    @arenmkhoyan 11 місяців тому +1

    Very nice, thanks

  • @anthonyuccello1458
    @anthonyuccello1458 2 роки тому

    This channel is the real leetcode premium

  • @thanirmalai
    @thanirmalai 4 місяці тому

    Amazing solution

  • @begula_chan
    @begula_chan 6 місяців тому

    Thank you very much! This was really good

  • @skylyyun
    @skylyyun Рік тому

    Thanks! very great explanation!

  • @kvtys
    @kvtys Місяць тому +1

    not enough circling at 8:00, failed to understand

  • @anshhchaturvedi1155
    @anshhchaturvedi1155 Рік тому

    This approach is giving TLE in C++

    • @anshhchaturvedi1155
      @anshhchaturvedi1155 Рік тому

      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

    • @tarunsahu1366
      @tarunsahu1366 3 місяці тому

      @@anshhchaturvedi1155
      class Solution {
      public:
      vector func(TreeNode* root){
      if(root == NULL) return {0, 0};
      vector leftPair = func(root->left);
      vector rightPair = func(root->right);
      int withRoot = root->val + leftPair[1] + rightPair[1];
      int withoutRoot = max(leftPair[0], leftPair[1]) + max(rightPair[0], rightPair[1]);
      return {withRoot, withoutRoot};
      }
      int rob(TreeNode* root) {
      vector result = func(root);
      return max(result[0], result[1]);
      }
      };

  • @RobinHistoryMystery
    @RobinHistoryMystery 6 місяців тому

    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

  • @dhaanaanjaay
    @dhaanaanjaay 7 місяців тому

    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

  • @___vandanagupta___
    @___vandanagupta___ Рік тому

    Very well explained!!! .

  • @HarshaVardhan-pj5gp
    @HarshaVardhan-pj5gp Місяць тому

    You are just amazing 😭❤️

  • @amitarya4894
    @amitarya4894 Місяць тому

    Thank you

  • @BarneyBing883
    @BarneyBing883 2 роки тому

    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!

  • @ambarishdashora5440
    @ambarishdashora5440 2 роки тому

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

  • @yinglll7411
    @yinglll7411 2 роки тому

    Thank you for the great explanation!

  • @ritikkhatri
    @ritikkhatri 3 роки тому

    such clear explanation

  • @ananya___1625
    @ananya___1625 2 роки тому

    Great explanation!!!

  • @s.z.7938
    @s.z.7938 2 роки тому

    Amazing, really helpful, thank you!!!

  • @hoanganhtu9090
    @hoanganhtu9090 3 роки тому

    great explaination

  • @annoyingorange90
    @annoyingorange90 2 роки тому

    BEAUTIFUL SOLUTION

  • @edwardteach2
    @edwardteach2 3 роки тому +1

    U a God

  • @nikhilchauhan5837
    @nikhilchauhan5837 3 роки тому

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

  • @sangamsamdarshi4634
    @sangamsamdarshi4634 Рік тому

    recursion makes problems easy af

  • @andreytamelo1183
    @andreytamelo1183 2 роки тому

    Thanks!

  • @ladanafar5917
    @ladanafar5917 3 роки тому

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

  • @aditijain2448
    @aditijain2448 Рік тому

    Will this solution be enough in an interview

  • @danielsun716
    @danielsun716 2 роки тому

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

    • @jorgemejia1586
      @jorgemejia1586 2 роки тому

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

    • @danielsun716
      @danielsun716 2 роки тому

      @@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 2 роки тому

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

  • @zacyou4220
    @zacyou4220 2 роки тому

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

  • @joydeeprony89
    @joydeeprony89 Рік тому

    Smooth like Vaseline.

  • @asdfasyakitori8514
    @asdfasyakitori8514 2 роки тому +1

    Nice thumbnail

  • @ajinkya-wasnik
    @ajinkya-wasnik Рік тому

    beautiful

  • @shaharrefaelshoshany9442
    @shaharrefaelshoshany9442 3 роки тому

    the most perfect ever.

  • @binit1992
    @binit1992 2 роки тому

    Can we solve it using BFS ?

  • @SmoothCode
    @SmoothCode 3 роки тому

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

    • @rohithv63
      @rohithv63 3 роки тому

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

  • @midhileshmomidi3120
    @midhileshmomidi3120 2 роки тому

    Can we do level order traversal on this

    • @sindhu5840
      @sindhu5840 Рік тому

      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

  • @whatuphere
    @whatuphere 2 місяці тому

    Prabhu to the rescue!! _/\_

  • @adityarathi3420
    @adityarathi3420 2 роки тому

    Thanks you sir! :-)

  • @kwaminaessuahmensah8920
    @kwaminaessuahmensah8920 3 роки тому

    god right here people

  • @PoojaMehta271
    @PoojaMehta271 3 роки тому +1

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

  • @jorgemejia1586
    @jorgemejia1586 2 роки тому

    bro i thought you could use bfs on this one

  • @dhiwakarna8509
    @dhiwakarna8509 Рік тому

    Why are we helping the thief?

  • @sourav_ghosh
    @sourav_ghosh 3 роки тому +1

    Picasso 🤏🤏

  • @laplacesdemon8140
    @laplacesdemon8140 3 роки тому

    OMG ! genius

  • @coldstone87
    @coldstone87 2 роки тому

    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.

  • @skmdmobinulislam3904
    @skmdmobinulislam3904 2 роки тому

    when a teacher unlocks his god-level mode 🤯

  • @nikhilgoyal007
    @nikhilgoyal007 Рік тому

    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 Рік тому

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

  • @shadowsw8020
    @shadowsw8020 4 місяці тому

    'The thief realized it forms a binary tree' wtf is this shit lmao

  • @WowPlusWow
    @WowPlusWow 3 роки тому

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

  • @alishan9354
    @alishan9354 2 роки тому

    please start coding in c++

    • @adityarathi3420
      @adityarathi3420 2 роки тому +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) ;

      }
      };

    • @shivansh-gup
      @shivansh-gup 2 роки тому

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

    • @adityarathi3420
      @adityarathi3420 2 роки тому

      @@shivansh-gup without memoization i will getting tle on leetcode.

    • @shivansh-gup
      @shivansh-gup 2 роки тому

      @@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 ?

  • @officialnepalcricket
    @officialnepalcricket Рік тому

    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 5 місяців тому

    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)

  • @salahabdelrahman7820
    @salahabdelrahman7820 2 місяці тому

    Great Explaination