【算法-Java实现】跳跃游戏

【算法-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;
	}
}

猜你喜欢

转载自blog.csdn.net/hkdhkdhkd/article/details/109317976
今日推荐