巡礼 — LeetCode Punch 37 日目
知識のまとめ
貪欲なアルゴリズムの最終章は、賢い考え方です。
Leetcode 738. 単調増加する数値
トピックの説明
整数は、隣接する各桁の数値 x と y が x <= y を満たす場合に限り、単調増加であると言われます。
整数 n を指定すると、単調増加する n 以下の最大の数値を返します。
コードの説明
アルゴリズムのアイデア: 右から左に移動し、num[i] > num[i+1] (98 など) に遭遇した場合、この 9 から 1 を減算し、上位ビットは 9 になります。最終的に 89 になります。
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] list = s.toCharArray();
int start = s.length();
for(int i = list.length -2; i>= 0; i--){
if(list[i] > list[i+1]){
list[i] = (char) (list[i] - 1);
start = i+1;
}
}
for(int i = start; i< list.length; i++){
list[i] = '9';
}
return Integer.parseInt(String.valueOf(list));
}
}
Leetcode 968. 監視バイナリ ツリー
トピックの説明
バイナリ ツリーが与えられた場合、ツリーのノードにカメラをインストールします。
ノード上の各カメラは、その親、それ自体、およびその直接の子を監視できます。
ツリーのすべてのノードを監視するために必要なカメラの最小数を計算します。
コードの説明
リーフノードからルートノードへの下から上への走査は後続走査の方法を採用する。
3 つの状況について説明します。
class Solution {
int result = 0;
public int minCameraCover(TreeNode root) {
// 0 no cover
// 1 cover but no camera
// 2 camera
if(dfs(root) == 0){
result++;
}
return result;
}
public int dfs(TreeNode cur){
if(cur == null){
return 1;
}
int left = dfs(cur.left);
int right = dfs(cur.right);
if(left == 0 || right == 0){
result++;
return 2;
}
if(left == 2 || right == 2){
return 1;
}
// left == 1 && right == 1
return 0;
}
}