[leetcode 周赛 148] 1145 二叉树着色游戏

目录

  • 1145 Binary Tree Coloring Game 二叉树着色游戏

    • 描述
    • 思路
    • 代码实现

1145 Binary Tree Coloring Game 二叉树着色游戏

描述

有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1n 各不相同。

游戏从「一号」玩家开始(「一号」玩家为红色,「二号」玩家为蓝色),最开始时,

  • 「一号」玩家从 [1, n] 中取一个值 x(1 <= x <= n);
  • 「二号」玩家也从 [1, n] 中取一个值 y(1 <= y <= n)且 y != x。
  • 「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。

之后两位玩家轮流进行操作,每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。
如果当前玩家无法找到这样的节点来染色时,他的回合就会被跳过。
若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ??。

现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true;若无法获胜,就请返回 false。

  • 示例:

输入:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3
输出:True
解释:第二个玩家可以选择值为 2 的节点。

  • 提示:

    二叉树的根节点为 root,树上由 n 个节点,节点上的值从 1 到 n 各不相同。
    n 为奇数。
    1 <= x <= n <= 100

思路

题意中树上每个节点都是双向的, 即树的点都是互联的, 如果不将其阻拦, 任意树上一节点都可以到任意树上另一节点
因为树上两点有且只有一条相连路径, 所以如果对方想连接目标点, 但你将该连接路径的点占领, 那么对方就无法相连目标点了
以此推出, 最容易切断对方连接外部点的关键点在: 父节点/左子节点/右子节点
所以解题思路为: 截断对方的父节点/左子节点/右子节点
并查看所截断的那部分是否大于其余两部分

可以从上图看出, 在对方选出X值后, 我们可以将二叉树分成三部分, 他们的结果求解如下:
左子节点DFS 右子节点DFS 父节点n-X节点DFS
选取以上三部分最大值, 判断是否大于n/2, 即占据一半以上
有着表示己方胜利

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // 三个部分的最大值
    int maxCount = 0;
    // 记录二叉树每个节点DFS的值
    int[] sizeOfNode = new int[150];

    // dfs 做法
    // 叶子节点置为1 其父节点为子节点之和+1
    int dfs(TreeNode root, int x) {
        int v = root.val;
        sizeOfNode[v] = 1;

        if (root.left != null) {
            int c = dfs(root.left, x);
            sizeOfNode[v] += c;
            // 如果当前节点为对方选取点, c就表示是其左子节点DFS的值
            if (x == v) {
                maxCount = Math.max(maxCount, c);
            }
        }
        if (root.right != null) {
            int c = dfs(root.right, x);
            sizeOfNode[v] += c;
            // 如果当前节点为对方选取点, c就表示是其右子节点DFS的值
            if (x == v) {
                maxCount = Math.max(maxCount, c);
            }
        }
        return sizeOfNode[v];
    }

    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        // 对二叉树进行DFS
        dfs(root, x);
        // 比对父节点 与左右子节点的最大值
        maxCount = Math.max(maxCount, n-sizeOfNode[x]);
        // 如果己方遍历节点数大于 n/2 则对方必然小于己方
        return maxCount > n/2;
    }
}

原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11306493.html

时间: 2024-08-29 21:54:48

[leetcode 周赛 148] 1145 二叉树着色游戏的相关文章

1145二叉树着色游戏

题目: 有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同. 来源: https://leetcode-cn.com/problems/binary-tree-coloring-game/ 法一: 自己的代码 思路: 用迭代方法,先找到一号玩家着色的第一个节点,再计算该节点左子树和右子树的节点个数.好处是寻找第一个节点的过程无需遍历每个节点.而用递归的方法则需要. # Defini

Leetcode 101 Symmetric Tree 二叉树

判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert Binary Tree,然后用Same Tree比较左右子树 而我的做法是改下Same Tree的函数,改动的是第27行 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNo

Android 不规则图像填充 小玩着色游戏

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45788433: 本文出自:[张鸿洋的博客] 一.概述 近期群里偶然看到一哥们在群里聊不规则图像填充什么四联通.八联通什么的,就本身好学务实的态度去查阅了相关资料.对于这类着色的资料,最好的就是去搜索些相关app,根据我的观察呢,不规则图像填充在着色游戏里面应用居多,不过大致可以分为两种: 基于层的的填充 基于边界的填充 那么针对上述两种,我们会通过两篇博文来讲解,本篇就是叙述

LeetCode | 面试题34. 二叉树中和为某一值的路径【剑指Offer】【Python】

LeetCode 面试题34. 二叉树中和为某一值的路径[剑指Offer][Medium][Python][回溯] 问题 力扣 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 返回: [ [5,4,11,2], [5,8,4,5] ] 提示: 节点总数 <= 10000 注意:本题与主站 1

[LeetCode] Binary Tree Tilt 二叉树的坡度

Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the absolute difference between the sum of all left subtree node values and the sum of all right subtree node values. Null node has tilt 0. The tilt of the 

[LeetCode] Bulls and Cows 公母牛游戏

You are playing the following Bulls and Cows game with your friend: You write a 4-digit secret number and ask your friend to guess it, each time your friend guesses a number, you give a hint, the hint tells your friend how many digits are in the corr

【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranking: 440/2797.这次题目似乎比较简单,因为我比赛的时候前三题全做出来了(1:12:39),然后第四题有思路,正在写,没写完,比赛完了写完提交也对了. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [821]

【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653-656) 链接:https://leetcode.com/contest/leetcode-weekly-contest-44 比赛情况记录:就做出来两题,第三题不难,然而就是在算坐标的时候卡住了.orz.结果:2/4,ranking:637/2272.第四题没看题,第三题搞得心情不好了orz. [653]Two Sum

【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日补充的报告.当时不想写.rank:1093/3924,AC:2/4.还是太慢了. [984]String Without AAA or BBB(第一题 4分)(Greedy, M) 给了两个数字,A 代表 A 个 'A', B 代表 B 个'B' 在字符串里面.返回一个可行的字符串,字符串中包含 A