LeetCode チェックイン 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; 
    }
}

おすすめ

転載: blog.csdn.net/weixin_45872648/article/details/131245577