👽
Software Engineer Interview Handbook
  • README
  • Behavioral
    • Useful Links
    • Dongze Li
  • Algorithm
    • Segment Tree
    • Array
      • Product Of Array Except Self
      • Merge Strings Alternately
      • Increasing Triplet Subsequence
      • String Compression
      • Greatest Common Divisor Strings
      • Max Product Of Three
      • Find Duplicate Num
      • Valid Palindrome Ii
      • Next Permutation
      • Rearrange Array By Sign
      • Removing Min Max Elements
      • Find Original Array From Doubled
      • Reverse Words Ii
    • Backtracking
      • Letter Combination Phone Number
      • Combination Sum Iii
      • N Queens
      • Permutations
      • Combination Sum
    • Binary Search
      • Koko Eating Bananas
      • Find Peak Element
      • Successful Pairs Of Spells Potions
    • Binary Search Tree
      • Delete Node In BST
      • Validate Bst
      • Range Sum Bst
    • Binary Tree
      • Maximum Depth
      • Leaf Similar Trees
      • Maximum Level Sum
      • Binary Tree Right Side
      • Lowest Common Ancestor
      • Longest Zigzag Path
      • Count Good Nodes
      • Path Sum III
      • Maximum Path Sum
      • Move Zero
      • Diameter Binary Tree
      • Sum Root Leaf Number
      • Traversal
      • Binary Tree Vertical Order
      • Height Tree Removal Queries
      • Count Nodes Avg Subtree
      • Distribute Coins
      • Binary Tree Max Path Sum
    • Bit
      • Min Flips
      • Single Number
      • Pow
      • Find Unique Binary Str
    • BFS
      • Rotten Oranges
      • Nearest Exist From Entrance
      • Minimum Knight Moves
      • Network Delay Time
      • Minimum Height Tree
      • Knight Probability In Board
    • Design
      • LRU Cache
      • Get Random
      • LFU Cache
      • Moving Average
      • Rle Iterator
      • Design Hashmap
    • DFS
      • Reorder Routes Lead City
      • Evaluate Division
      • Keys And Rooms
      • Number Of Provinces
      • Disconnected Path With One Flip
      • Course Schedule Ii
      • Robot Room Cleaner
      • Word Break Ii
      • Number Coins In Tree Nodes
      • Maximum Increasing Cells
      • Number Coins In Tree Nodes
      • Detonate Maximum Bombs
      • Find All Possible Recipes
      • Min Fuel Report Capital
      • Similar String Groups
    • DP
      • Domino And Tromino Tiling
      • House Robber
      • Longest Common Subsequence
      • Trade Stock With Transaction Fee
      • Buy And Sell Stock
      • Longest Non Decreasing Subarray
      • Number Of Good Binary Strings
      • Delete And Earn
      • Minimum Costs Using Train Line
      • Decode Ways
      • Trapping Rain Water
      • Count Fertile Pyramids
      • Minimum Time Finish Race
      • Knapsack
      • Count Unique Char Substrs
      • Count All Valid Pickup
    • Greedy
      • Dota2 Senate
      • Smallest Range Ii
      • Can Place Flowers
      • Meeting Rooms II
      • Guess the word
      • Minimum Replacement
      • Longest Palindrome Two Letter Words
      • Parentheses String Valid
      • Largest Palindromic Num
      • Find Missing Observations
      • Most Profit Assigning Work
    • Hashmap
      • Equal Row Column Pairs
      • Two Strings Close
      • Group Anagrams
      • Detect Squares
    • Heap
      • Maximum Subsequence Score
      • Smallest Number Infinite Set
      • Total Cost Hire Workers
      • Kth Largest Element
      • Meeting Rooms III
      • K Closest Points Origin
      • Merge K Sorted List
      • Top K Frequent Elements
      • Meeting Room III
      • Num Flowers Bloom
      • Find Median From Stream
    • Intervals
      • Non Overlapping Intervals
      • Min Arrows Burst Ballons
    • Linkedlist
      • Reverse Linked List
      • Delete Middle Node
      • Odd Even Linkedlist
      • Palindrome Linkedlist
    • Monotonic Stack
      • Daily Temperatures
      • Online Stock Span
    • Random
      • Random Pick With Weight
      • Random Pick Index
      • Shuffle An Array
    • Recursion
      • Difference Between Two Objs
    • Segment Fenwick
      • Longest Increasing Subsequence II
    • Stack
      • Removing Stars From String
      • Asteroid Collision
      • Evaluate Reverse Polish Notation
      • Building With Ocean View
      • Min Remove Parentheses
      • Basic Calculator Ii
      • Simplify Path
      • Min Add Parentheses
    • Prefix Sum
      • Find The Highest Altitude
      • Find Pivot Index
      • Subarray Sum K
      • Range Addition
    • Sliding Window
      • Max Vowels Substring
      • Max Consecutive Ones III
      • Longest Subarray Deleting Element
      • Minimum Window Substring
      • K Radius Subarray Averages
    • String
      • Valid Word Abbreviations
    • Two Pointers
      • Container With Most Water
      • Max Number K Sum Pairs
      • Is Subsequence
      • Num Substrings Contains Three Char
    • Trie
      • Prefix Tree
      • Search Suggestions System
      • Design File System
    • Union Find
      • Accounts Merge
    • Multithreading
      • Basics
      • Web Crawler
  • System Design
    • Operating System
    • Mocks
      • Design ChatGPT
      • Design Web Crawler
      • Distributed Search
      • News Feed Search
      • Top K / Ad Click Aggregation
      • Design Job Scheduler
      • Distributed Message Queue
      • Google Maps
      • Nearby Friends
      • Proximity Service
      • Metrics monitoring and alert system
      • Design Email
      • Design Gaming Leaderboard
      • Facebook New Feed Live Comments
      • Dog Sitting App
      • Design Chat App (WhatsApp)
      • Design Youtube/Netflix
      • Design Google Doc
      • Design Webhook
      • Validate Instacart Shopper Checkout
      • Design Inventory
      • Design donation app
      • Design Twitter
    • Deep-Dive
      • Back of Envelope
      • Message Queue
      • Redis Sorted Set
      • FAQ
      • Geohash
      • Quadtree
      • Redis Pub/Sub
      • Cassandra DB
      • Collaborative Concurrency Control
      • Websocket / Long Polling / SSE
    • DDIA
      • Chapter 2: Data Models and Query Languages
      • Chapter 5: Replication
      • Chapter 9: Consistency and Consensus
  • OOD
    • Overview
    • Design Parking
  • Company Tags
    • Meta
    • Citadel
      • C++ Fundamentals
      • 面经1
      • Fibonacci
      • Pi
      • Probability
    • DoorDash
      • Similar String Groups
      • Door And Gates
      • Max Job Profit
      • Design File System
      • Count All Valid Pickup
      • Most Profit Assigning Work
      • Swap
      • Binary Tree Max Path Sum
      • Nearest Cities
      • Exployee Free Time
      • Tree Add Removal
    • Lyft
      • Autocomplete
      • Job Scheduler
      • Read4
      • Kvstore
    • Amazon
      • Min Binary Str Val
    • AppLovin
      • TODO
      • Java Basic Questions
    • Google
      • Huffman Tree
      • Unique Elements
    • Instacart
      • Meeting Rooms II
      • Pw
      • Pw2
      • Pw3
      • Expression1
      • Expression2
      • Expression3
      • PW All
      • Expression All
      • Wildcard
      • Free forum tech discussion
    • OpenAI
      • Spreadsheet
      • Iterator
      • Kv Store
    • Rabbit
      • Scheduler
      • SchedulerC++
    • [Microsoft]
      • Min Moves Spread Stones
      • Inorder Successor
      • Largest Palindromic Num
      • Count Unique Char Substrs
      • Reverse Words Ii
      • Find Missing Observations
      • Min Fuel Report Capital
      • Design Hashmap
      • Find Original Array From Doubled
      • Num Flowers Bloom
      • Distribute Coins
      • Find Median From Stream
Powered by GitBook
On this page
  1. Algorithm
  2. DFS

Number Coins In Tree Nodes

// https://leetcode.com/problems/find-number-of-coins-to-place-in-tree-nodes/

// You are given an undirected tree with n nodes labeled from 0 to n - 1, and rooted at node 0. 
// You are given a 2D integer array edges of length n - 1, where edges[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the tree.

// You are also given a 0 - indexed integer array cost of length n, where cost[i] is the cost assigned to the ith node.

// You need to place some coins on every node of the tree.The number of coins to be placed at node i can be calculated as :

// If size of the subtree of node i is less than 3, place 1 coin.
// Otherwise, place an amount of coins equal to the maximum product of cost values assigned to 3 distinct nodes in the subtree of node i.
// If this product is negative, place 0 coins.
// Return an array coin of size n such that coin[i] is the number of coins placed at node i.

// Ex1:
// Input : edges = [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5]], cost = [1, 2, 3, 4, 5, 6]
// Output : [120, 1, 1, 1, 1, 1]
// Explanation : For node 0 place 6 * 5 * 4 = 120 coins.All other nodes are leaves with subtree of size 1, place 1 coin on each of them.

// Ex2:
// Input : edges = [[0, 1], [0, 2], [1, 3], [1, 4], [1, 5], [2, 6], [2, 7], [2, 8]], cost = [1, 4, 2, 3, 5, 7, 8, -4, 2]
// Output : [280, 140, 32, 1, 1, 1, 1, 1, 1]
// Explanation : The coins placed on each node are :
// -Place 8 * 7 * 5 = 280 coins on node 0.
// - Place 7 * 5 * 4 = 140 coins on node 1.
// - Place 8 * 2 * 2 = 32 coins on node 2.
// - All other nodes are leaves with subtree of size 1, place 1 coin on each of them.

// Ex3:
// Input : edges = [[0, 1], [0, 2]], cost = [1, 2, -2]
// Output : [0, 1, 1]
// Explanation : Node 1 and 2 are leaves with subtree of size 1, place 1 coin on each of them.
// For node 0 the only possible product of cost is 2 * 1 * -2 = -4. Hence place 0 coins on node 0.

#include <unordered_map>
#include <vector>
#include <iostream>
#include <unordered_set>

using namespace std;

class Solution {
public:
    struct Subtree {
        int pos1;
        int pos2;
        int pos3;
        int neg1;
        int neg2;
        int size;

        Subtree(int pos1,
            int pos2,
            int pos3,
            int neg1,
            int neg2, int size) :
            size(size), pos1(pos1), pos2(pos2), pos3(pos3), neg1(neg1), neg2(neg2) {}
    };
    // node 0 -> 1, 2, 3, 4, 5 
    // if len(neighbors) < 3, place 1 coin at current level.
    // go to next level, 1, 2, 3, 4, 5
    // {6, 5, 4} = 120
    void updateMax(int& pos1,
        int& pos2,
        int& pos3,
        int& neg1,
        int& neg2,
        int cost) {
        if (cost > 0) {
            if (cost >= pos1) {
                pos3 = pos2;
                pos2 = pos1;
                pos1 = cost;
            }
            else if (cost >= pos2) {
                pos3 = pos2;
                pos2 = cost;
            }
            else if (cost >= pos3) {
                pos3 = cost;
            }
        }
        else {
            if (cost <= neg1) {
                neg2 = neg1;
                neg1 = cost;
            }
            else if (cost <= neg2) {
                neg2 = cost;
            }
        }
    }

    Subtree dfs(unordered_map<int, vector<int>>& graph, int curr,
        vector<long long>& res,
        vector<int>& cost,
        unordered_set<int>& visited) {
        if (graph[curr].size() == 1 && visited.count(graph[curr][0])) {
            res[curr] = 1;
            int pos = max(cost[curr], 0);
            int neg = min(cost[curr], 0);
            Subtree subtree(pos, 0, 0, neg, 0, 1);
            return subtree;
        }

        int s = 0;
        int pos1 = 0, pos2 = 0, pos3 = 0;
        int neg1 = 0, neg2 = 0;
        for (int i = 0; i < graph[curr].size(); i++) {
            int neighbor = graph[curr][i];
            if (visited.count(neighbor)) continue;
            visited.insert(neighbor);
            Subtree subtree = dfs(graph, neighbor, res, cost, visited);
            s += subtree.size;
            updateMax(pos1, pos2, pos3, neg1, neg2, subtree.pos1);
            updateMax(pos1, pos2, pos3, neg1, neg2, subtree.pos2);
            updateMax(pos1, pos2, pos3, neg1, neg2, subtree.pos3);
            updateMax(pos1, pos2, pos3, neg1, neg2, subtree.neg1);
            updateMax(pos1, pos2, pos3, neg1, neg2, subtree.neg2);
        }

        updateMax(pos1, pos2, pos3, neg1, neg2, cost[curr]);

        if (s + 1 < 3) {
            res[curr] = 1;
        }
        else {
            long long newCost = (pos1 != 0 && pos2 != 0 && pos3 != 0) ? (long long)pos1 * pos2 * pos3 : 0;
            long long newCost2 = (neg1 != 0 && neg2 != 0 && pos1 != 0) ? (long long)pos1 * neg1 * neg2 : 0;
            long long finalCost = (newCost > newCost2) ? newCost : newCost2;
            if (finalCost < 0) {
                res[curr] = 0;
            }
            else {
                res[curr] = finalCost;
            }
        }

        Subtree subtree(pos1, pos2, pos3, neg1, neg2, s + 1);
        return subtree;
    }
    vector<long long> placedCoins(vector<vector<int>>& edges, vector<int>& cost) {
        // constructing the graph.
        unordered_map<int, vector<int>> graph;
        int n = edges.size();
        for (int i = 0; i < n; i++) {
            int s = edges[i][0];
            int e = edges[i][1];

            graph[s].push_back(e);
            graph[e].push_back(s);
        }

        vector<long long> coins(cost.size(), -1);
        unordered_set<int> visited;
        visited.insert(0);
        dfs(graph, 0, coins, cost, visited);
        return coins;
    }
};```
PreviousWord Break IiNextMaximum Increasing Cells

Last updated 1 year ago