ソートIIを作るためにLeetCode 768マックスチャンク

ここでのオリジナルタイトルリンク: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 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/11367324.html