タイトル説明
負でない整数の配列を指定すると、最初は配列の最初の要素の位置にいます。配列内の要素は、この位置でジャンプできる最大長を表します。目標は、配列の最後の要素に到達するために最小数のジャンプを使用することですsの位置。たとえば、配列A = [2,3,1,1,4]の場合、配列の最後の要素の位置にジャンプするには少なくとも2回かかります。(配列インデックスが0の位置から、長さ1をインデックス1の位置にジャンプし、次に長さ3を配列の最後の要素の位置にジャンプします)
負でない整数の配列を指定すると、最初は配列の最初のインデックスに配置されます。配列の各要素は、その位置での最大ジャンプ長を表します。目標は、最小ジャンプ数の最後のインデックスに到達することです。
例:与えられた配列A = [2,3,1,1,4]。最後のインデックスに到達するための最小ジャンプ数は2です。(Jump1stepはインデックス0から1に、次に3ステップは最後のインデックスに。)
問題分析
特定の位置iからジャンプして、可能な限り位置A [i] + iにジャンプし、次に位置i + 1〜i + A [i]の任意の位置にジャンプする必要があります。ジャンプを満たすために必要な位置は1つだけです。この位置で離陸した後、最も遠い距離にジャンプできます。サブ問題の最適解を取得し、最長距離を解決し、全体的な最適解を取得することにより、問題をサブ問題に分割できます。
アルゴリズムの分析
この問題は貪欲な考え方で解決できます。局所最適解、つまり局所ジャンプの最長距離を解くことにより、最小数のジャンプが得られます。位置iの場合、i + A [i]にジャンプして、i + A [i]をcurとして定義できます。次に、i + 1からcurの範囲で、この範囲でジャンプできるジャンプの最大値を見つけます。最後の変数をジャンプするための最も遠い距離を記録し、それを現在の位置と比較します。現在の位置よりも小さい場合は、それを現在ジャンプできる最も遠い距離curに設定し、ジャンプの数を1増やします。アルゴリズムの時間の複雑さはO(n)です。
コーディングの実装
public class Solution {
public int jump(int[] A) {
int cur=0;
int last=0;
int step=0;
for(int i=0; i<A.length && cur>=i; i++)
{
if(i>last)
{
last=cur;
step++;
}
cur =cur>(A[i]+i)?cur:(A[i]+i);
}
return step;
}
}