ここでのオリジナルタイトルリンク:https://leetcode.com/problems/max-chunks-to-make-sorted/
トピック:
配列を指定して arr
の順列で [0, 1, ..., arr.length - 1]
、我々は「チャンク」(パーティション)のいくつかの数に配列を分割し、個別に各チャンクを並べ替えます。それらを連結した後、結果がソートされた配列に等しいです。
私たちが作っている可能性がチャンクのほとんどの数は何ですか?
例1:
入力:ARR = [4,3,2,1,0] 出力:1つの 説明: 二つ以上のチャンクに分割が必要な結果を返しません。 例えば、[4,3]、に分割[2、1、0]、ソートされていない[2 3、4、0、1]になります。
例2:
入力:ARR = [1,0,2,3,4] 出力:4 説明: 我々は2つのチャンクに分割することができ、例えば、[1,0]、[2、3、4]。 しかし、[1,0]への分割は、[2]、[3]、[4]の可能なチャンクの最大数です。
注意:
arr
範囲の長さを持つことになります[1, 10]
。arr[i]
の順列になります[0, 1, ..., arr.length - 1]
。
ソリューション:
例から、我々は自分自身を含め、その左のすべての値は、すべてのインデックスをカバーできる点までの場合は、インデックスの動きを伝えることができ、それはチャンクに分割することができます。
[2、0、1]。I = 0、すべての値が[2]、インデックスi = 0は0で覆われていない場合、それはチャンクではありません。
I = 1の値が[2,0]、I = 1が1で覆われていない、それはチャンクではありません。
I = 2値[2、0、1]のすべてのインデックスが覆われ得ます。それはチャンクに分割することができます。
すべてのインデックスがcoverredしている場合、どのように指示します。一つの方法は、最大== iは、すべてのインデックスがcoverredされている場合、最大を維持することです。最大場合は!=私は、それから、最大は私よりも大きくなければなりません。すなわち、より大きなスキャンつの値があることを意味し、まだスキャンされていない1つのインデックス位置が存在しなければなりません。
時間計算:O(n)を。N = arr.length。
スペース:O(1)。
ACのJava:
1 クラスソリューション{ 2 公共 INT maxChunksToSorted(INT [] ARR){ 3 INT RES = 0 。 4 もし(ARR == NULL || arr.length == 0 ){ 5つの リターンRES。 6 } 7 8 int型の最大値= 0 。 図9は、 のために(int型 i = 0; I <arr.length; iは++ ){ 10 、最大= Math.max(最大、ARR [I])。 11 であれば(MAX == I){ 12の RES ++; 13 } 14 } 15の 16 戻りRES。 17 } 18 }
追いつくために最大チャンクにするためにソートII。