[Leet Code] Binary Tree Cameras
こんにちは!
今日、5月の3週目の2番目のアルゴリズムBinary Tree Camerasプールについて書きます.
サマリ
特定のツリー内のすべてのノードを監視するためにカメラをインストールする必要があります.
カメラをインストールすると、親ノードと下の子ノードを直接監視できます.
この場合、問題は、必要なカメラの最低数を返すことです.
問題は、
カメラ数を効率的に計算するには、
最初は整数値で検証したが,論理的毒性が悪く理解し難い.
したがって、
必要なカメラの数を条件通りに返した結果、受け入れられました.
したがって、ノードがない場合は
ノードが存在する場合、左側のサブノードのタイプは
1.サブノードがない場合は、
2.いずれかのサブノードが監視されている場合、他のノードが監視されている場合、またはノードが存在しない場合、
3.上記でない場合は、カメラを追加し、
したがって、1は、これまでに検査された
比較的速い時間で私を喜ばせる問題を解決しました.
また、
今回の位置付けを読んでいただき、ありがとうございました:)
今日、5月の3週目の2番目のアルゴリズムBinary Tree Camerasプールについて書きます.
質問する
サマリ
特定のツリー内のすべてのノードを監視するためにカメラをインストールする必要があります.
カメラをインストールすると、親ノードと下の子ノードを直接監視できます.
この場合、問題は、必要なカメラの最低数を返すことです.
初めて試した方法
問題は、
TreeNode
というバイナリツリー構造体が固定されていることです.カメラ数を効率的に計算するには、
leaf
ノードから検索を開始すべきだと思います.最初は整数値で検証したが,論理的毒性が悪く理解し難い.
2回目の試みの方法
したがって、
enum
を使用して、現在のノードが監視されているノードなのか、監視が必要なノードなのかを判断するために、サブノードのtype
をチェックします.必要なカメラの数を条件通りに返した結果、受け入れられました.
コードの説明
int answer = 0;
Solution
クラスのグローバル変数を使用してanswer
を初期化します.enum Monitoring {
NONE, MONITORING, REQUIRED
}
enum
は、上記のように設定されています.dfs
メソッドを使用しているため、サブノードがない場合もチェックを行う必要があります.したがって、ノードがない場合は
NONE
、監視中の場合はMONITORING
、監視が必要な場合はREQUIRED
とする.private Monitoring dfs(TreeNode node) {
if (node == null) return Monitoring.NONE;
Monitoring leftType = dfs(node.left);
Monitoring rightType = dfs(node.right);
// ...
}
leaf
ノードに入るとノードが存在しない場合は、NONE
を返します.ノードが存在する場合、左側のサブノードのタイプは
leftType
に設定され、右側のサブノードのタイプはrightType
に設定され、dfs
が呼び出される.private Monitoring dfs(TreeNode node) {
// ...
if (leftType == Monitoring.NONE && rightType == Monitoring.NONE) return Monitoring.REQUIRED;
else if ((leftType == Monitoring.MONITORING && rightType != Monitoring.REQUIRED) || (rightType == Monitoring.MONITORING && leftType != Monitoring.REQUIRED))
return Monitoring.NONE;
answer++;
return Monitoring.MONITORING;
}
条件1.サブノードがない場合は、
leaf
ノードであり、REQUIRED
タイプを返します.2.いずれかのサブノードが監視されている場合、他のノードが監視されている場合、またはノードが存在しない場合、
NONE
タイプが返されます.これは、次のノードが監視されていることを意味します.3.上記でない場合は、カメラを追加し、
MONITORING
タイプ(監視中)に戻ります.public int minCameraCover(TreeNode root) {
return (dfs(root) == Monitoring.REQUIRED) ? answer + 1: answer;
}
次に、return文に割り当てられたminCameraCover
関数からdfs
関数を呼び出します.dfs(root) == Monitoring.REQUIRED
は、root
ノードからleaf
ノードまでがチェックされていることを示し、root
ノードを監視する必要があることを意味する.したがって、1は、これまでに検査された
answer
に加えられる.完全なコード
class Solution {
int answer = 0;
public int minCameraCover(TreeNode root) {
return (dfs(root) == Monitoring.REQUIRED) ? answer + 1: answer;
}
private Monitoring dfs(TreeNode node) {
if (node == null) return Monitoring.NONE;
Monitoring leftType = dfs(node.left);
Monitoring rightType = dfs(node.right);
if (leftType == Monitoring.NONE && rightType == Monitoring.NONE) return Monitoring.REQUIRED;
else if ((leftType == Monitoring.MONITORING && rightType != Monitoring.REQUIRED) || (rightType == Monitoring.MONITORING && leftType != Monitoring.REQUIRED))
return Monitoring.NONE;
answer++;
return Monitoring.MONITORING;
}
}
enum Monitoring {
NONE, MONITORING, REQUIRED
}
の最後の部分
比較的速い時間で私を喜ばせる問題を解決しました.
また、
Java
では、あまり多くのタイプのenum
は使われていないので、これからは整数で条件を賭けるよりも、enum
をよく使うべきだと思います.今回の位置付けを読んでいただき、ありがとうございました:)
Reference
この問題について([Leet Code] Binary Tree Cameras), 我々は、より多くの情報をここで見つけました https://velog.io/@khyunjiee/Leet-Code-Binary-Tree-Camerasテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol