コード ランダム レコーディング アルゴリズム トレーニング キャンプ 37 日目 | 738. 単調増加数、968. バイナリ ツリーの監視 (1 回のスワイプでスキップ可能)、概要

目次

738. 単調増加する数値

968. 監視バイナリツリー(スキップ可能)

 要約する


738. 単調増加する数値

コード気まぐれ

解決策のアイデア:

貪欲アルゴリズムは常識的な質問だと感じます。一見、非常に単純な質問ですが、その原理を明確に説明するのは実は簡単ではありません。その中身のロジックは、まさに熟考に値するものです。初めて知りました。この質問について、Kage のビデオ説明を聞いて完全に混乱しました。なぜこれを行うのですか。Kage の考えを明確にしてから、コードのロジックに沿ってプロセスを進める方がはるかに簡単です。以下の点を考慮する必要があります。 1. String 文字列は不変の文字シーケンスであるため、
文字要素を直接変更できないため、各位置要素を変更するには、対応する文字配列に変換する必要があります。2. 設定された
フラグは、入力数値が単調増加のケースに準拠し、文字が変更されないことを確認するために配列の長さを調整します。配列の内容は、数値
3 を直接出力します。配列をトラバースするときは、後ろから後ろまでトラバースする必要があります。これにより、現在の文字を更新した後、前の文字との比較を続けることができ、前の数値が現在の走査番号よりも小さいことを確認できます。これも前から後ろに走査しないのはなぜですか 4. 場合のみ
。前の文字が現在の文字より大きい場合は、前の文字から 1 を減算します。
5. フラグの後のすべての要素がフラグになるようにフラグを定義します。 文字 9 に変更します。ここでは、numArr[i]='9' を直接操作することはできません。 1000 に遭遇すると 900 が出力されるため、これは明らかに間違っています。そのため、変更された文字ビット以降のすべての位置を「文字 '9' は正しい 6」に一律に変更する必要があります。 Arrays.toString(numArr) は使用できません
。文字配列を文字列に変換します。例として 10 の入力を取ると、このメソッドは配列の内容を表す文字列を返すため、出力は「[0,9]」になります。文字配列とその他の文字 (括弧やカンマなど)。

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String num = String.valueOf(n); //将整型n的值转换为对应的字符串形式
        char[] numArr = num.toCharArray(); //由于String字符串是不可变的字符序列,不能直接修改字符元素,因此需要转换成对应的字符数组对其每个位置元素进行修改
        int flag = numArr.length; //保证输入数字的符合单调递增的情况下,不会修改字符数组中的内容,直接原样输出数字
        for(int i = numArr.length - 1 ; i > 0; i--){ //从后往前遍历,这样更新当前字符后,可以继续与前一个字符继续比较,从而保证前一个数字小于当前遍历的数字,这也是为什么不从前往后遍历
            if(numArr[i-1] > numArr[i]){ //只对前一个字符大于当前字符的情况下,将前一个字符进行减1的操作
                numArr[i-1]--;
                flag = i; //定义一个标志位,使得从该标志位之后的所有位置的元素都将其修改为字符9,这里不能直接操作numArr[i]='9',因为如果遇到1000的话,就会输出900,显然是不正确的,因此需要将修改字符位之后的所有位置都统一修改为字符'9'才正确
            }
        }
        for(int i = flag; i < numArr.length; i++){  //如果输入数字符合单调递增,那么flag也没重新赋值,由于i<numArr.length限制,使得不会进入此循环,直接原样输出数字即可
            numArr[i] = '9';
        }
        // return Integer.parseInt(Arrays.toString(numArr)); 不能使用Arrays.toString(numArr)将字符数组转换为字符串,以输入的是10为例,输出将会是"[0,9]",因为这个方法返回的是一个表示数组内容的字符串,其中包含了字符数组的所有元素和其他字符(比如中括号和逗号)
        return Integer.parseInt(new String(numArr));
    }
}

968. 監視バイナリツリー(スキップ可能)

この質問は貪欲と二分木を組み合わせたもので、より難しいので、問題を解決したらすぐにスキップしてください。 

コード気まぐれ


 要約する

貪欲アルゴリズムの概要を読むことができます。貪欲にはルールがありません。要約を書くのは本当に簡単ではありません。 

コード気まぐれ

おすすめ

転載: blog.csdn.net/tore007/article/details/130974076