【算法-Java实现】跳跃游戏
一.问题描述:
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。
二.问题解答:
思路:贪心策略
1.从上面例子,我们知道数组的最后一个元素数值不起作用,只需判断数组前n-1个元素即可。
2.贪心策略:依次遍历数组,用int类型变量longestDistance记录数组每一个元素的最远可达位置,longestDistance=当前数组下标+当前数组下标数值,每次遍历用Math.max()方法保存当前最大值即可。
若longestDistance>=arr.length-1,即最远可达位置大于数组最后位置,返回true,否则返回false
三.算法分析:
1.时间复杂度为O(N):遍历数组for循环。
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;
}
}
文章评论