非負の整数の配列を考えると、あなたは最初に、配列の最初のインデックスに配置されています。
配列の各要素は、その位置で、あなたの最大ジャンプ長さを表しています。
あなたの目標はジャンプの最小番号の最後のインデックスに到達することです。
例:
入力:[2,3,1,1,4] 出力:2 説明:最後のインデックスに到達するジャンプの最小数は2である。 次に、1のインデックス0からジャンプ1つのステップ、最後のインデックスに3つのステップ。
解決策1:
DP時間:O(N ^ 2) - > TLE
クラスソリューション{ 公共 のintジャンプ(INT [] NUMS){ 場合(NUMS == NULL || nums.length <= 1 ){ 戻り 0 。 } INT [] ARR = 新しい INT [nums.length]。 [ARR 0] = 0 ; 以下のために(INT I 1 =; I <nums.length; I ++ ){ // initilize -1として、セット0が0、最終解像度につながる場合 ARR [I] = -1 。 以下のための(int型 J = 0; jの<I、J ++){ 場合(ARR [J]!= -1 && J + NUMS [j]> = I){ 場合(ARR [I] == -1 || ARR [J] + 1 < ARR [I]){ ARR [I] = ARR [J] + 1 。 } } } } 戻り ARR [nums.length - 1 ]。 } }
溶液2:
貪欲:O(N)
LCからは、レッツは、[curBegin、curEnd]現在のジャンプの範囲であると言う、curFarthestは、内のすべてのポイントその最遠点である[curBegin、curEnd]は到達することができます。現在のポイントがcurEndに到達すると、その後、別のジャンプをトリガー、およびcurFarthestで新しいcurEndを設定し、その後、次のように、上記の手順を続けます。
私== curEnd手段あなたは、現在のレベルのすべての項目を訪問しました。ジャンプをインクリメント++あなたがオンになっているレベルをインクリメントするようなものです。そしてcurEnd = curFarthestあなたが横断している次のレベルのキューサイズ(レベルの大きさ)を得るようなものです。
クラスソリューション{ 公共 のintジャンプ(INT [] NUMS){ 場合(NUMS == NULL || nums.length <= 1 ){ 戻り 0 。 } INT RES = 0 。 int型 curMax = 0 ; int型 nextMax = 0 ; 以下のために(INT I 0 =; I <nums.length - 1; I ++ ){ nextMax = Math.max(nextMax、I + NUMS [I])。 // 最後のステップは、この条件を得るべきでないとき 場合(I ==curMax){ RES + = 1 ; curMax = nextMax。 } } 戻りRES。 } }