ここでのオリジナルタイトルリンク:https://leetcode.com/problems/max-chunks-to-make-sorted-ii/
トピック:
この質問は、必ずしも明確なではありません指定された配列の整数を除いて、「ソートを行うために最大チャンク」と同じであり、入力配列は、長さまで可能性があり 2000
、かつ要素が最大かもしれません 10**8
。
配列を指定して arr
整数の(必ずしも明瞭ではない)、私たちは「チャンク」(パーティション)のいくつかの数に配列を分割し、個別に各チャンクを並べ替えます。それらを連結した後、結果がソートされた配列に等しいです。
私たちが作っている可能性がチャンクのほとんどの数は何ですか?
例1:
入力:ARR = [5,4,3,2,1] 出力:1つの 説明: 二つ以上のチャンクに分割が必要な結果を返しません。 例えば、に分割[5は、4]、[3、2、1]にソートされていない、[4、5、1、2、3]をもたらすであろう。
例2:
入力:ARR = [2,1,3,4,4] 出力:4 説明: 我々は2つのチャンクに分割することができ、例えば、[2,1]、[3,4]、[4]。 しかし、[2、1]に分割は、[3]、[4]、[4]の可能なチャンクの最大数です。
注意:
arr
範囲の長さを持つことになります[1, 2000]
。arr[i]
範囲の整数であろう[0, 10**8]
。
ソリューション:
私たちは、行の左側のすべての値が小さいか、ラインの右側のすべての値に等しい行を見つけたいです。
我々はそのような行の数を持っていたら、チャンク数はラインは+ 1カウントされます。
次に、どのようにこのような行を検索します。我々は、そのような行が存在し、左右maximimum <=右から左最小及び最小値から最大値を追跡することができました。
時間計算:O(n)を。N = arr.length。
スペース:O(1)。
ACのJava:
1 クラスソリューション{ 2 公共 INT maxChunksToSortedは(int型[] ARR){ 3 int型 N = arr.length。 4 INT [] leftMax = 新しい INT [N]。 5 INT [] rightMin = 新しい INT [N]。 6 int型の最大値= はInteger.MIN_VALUE。 図7は、 のために(int型 i = 0; iがn <; iは++ ){ 8 マックス= Math.max(最大、ARR [I])。 9 leftMax [I] = マックス; 10 } 11 12 INT分= Integer.MAX_VALUEで、 13 のために(int型 I = N-1、I> = 0; i-- ){ 14 分= Math.min(分、[I] ARR)。 15 rightMin [I] = 分。 16 } 17 18 int型のRES = 0 。 19 のためには、(int型 i = 0; iがN-1 <; Iは++ ){ 20 場合(leftMax [I] <= rightMin [I + 1 {]) 21の RES ++ 。 22 } 23 } 24 25 返す RES + 1を、 26 } 27 }