[アルゴリズム-Java実装]ジャンプゲーム
1.問題の説明:
1.入力:配列arrを入力します。配列内の各要素は正の整数であり、各正の整数は、その位置でジャンプできる最も遠い距離を表します。
2.出力:配列の最後の位置に到達できる場合はtrueを返し、それ以外の場合はfalseを返します。
といった:
入力[2,3,1,1,4]出力:true
分析:位置(添え字)0では、ジャンプできる最も遠い距離は2であり、位置(添え字)2に到達できます。
位置(添え字)1では、ジャンプできる最大距離は3であり、位置(添え字)4に到達できます。
配列の最後の位置に到達したため、trueを返します。
入力[3,1,1,1,0,3]出力:false
分析:位置(添え字)0では、ジャンプできる最も遠い距離は3であり、位置(添え字)3に到達できます。
位置(添え字)1では、最大ジャンプ距離は1であり、位置(添え字)2に到達できます。
位置(添え字)2では、ジャンプできる最も遠い距離は1であり、位置(添え字)3に到達できます。
位置(添え字)3では、ジャンプできる最も遠い距離は1であり、位置(添え字)4に到達できます。
位置(添え字)4では、最大ジャンプ距離は0であり、位置(添え字)4に到達できます。
位置(添え字)4 <位置(添え字)5、配列の最後の位置に到達できないため、falseが返されます。
2.質問の回答:
アイデア:欲張り戦略
1.上記の例から、配列の最後の要素の値が機能しないことがわかります。配列の最初のn-1要素を判断するだけです。
2.貪欲な戦略:配列を順番にトラバースし、int型変数longestDistanceを使用して、配列の各要素の到達可能な最も遠い位置を記録します。longestDistance=現在の配列添え字+現在の配列添え字値。各トラバーサルはMath.maxによって保存されます。 ()メソッド現在の最大値は問題ありません。
longestDistance> = arr.length-1の場合、つまり到達可能な最も遠い位置が配列の最後の位置よりも大きい場合はtrueを返し、そうでない場合はfalseを返します。
3.アルゴリズム分析:
1.時間計算量はO(N)です:ループの配列をトラバースします。
2.余分なスペースの複雑さはO(1)であり、余分なスペースはありません。
コードは以下のように表示されます
/*
* 问题:跳跃游戏
* 方法:贪心策略
*/
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] strArray = str.split(",");
int[] arr = new int[strArray.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(strArray[i]);
}
boolean flag = jumpGame(arr);
System.out.println(flag);
}
public static boolean jumpGame(int[] arr) {
int n = arr.length;
int longestDistance = 0; // 最远可达距离
for (int i = 0; i < n; i++) {
if (i <= longestDistance) {
longestDistance = Math.max(longestDistance, i + arr[i]);
if (longestDistance >= n - 1) {
return true;
}
}
}
return false;
}
}