jump game

如题:给定数组,问能否经历数组中的每个确定的步数使得可以从第一个位置开始到达最后一个位置

下面是我自己写的算法:

思想是这样:从第一个位置开始,我递归检查从第一个位置可以到达的所有可能位置是否可以到达数组末尾,可以就返回true,不可以就返回上一层递归中

public boolean canJump(int[] A) {		
		int i = 0;
		if(A[i]>=A.length-1){
			return true;
		}
		return canJumpPosition(i, A);
	}

	public boolean canJumpPosition(int i, int[] A) {
		System.out.println("从第" + i + "位置能否到达数组末尾");
		if (i >= A.length - 1) {
			System.out.println("到达数组末尾");
			return true;
		}
		// i位置分别经过A[i]步能否到达数组末尾
		for (; A[i] > 0; A[i]--) {
			System.out.println("检查经过" + A[i] + "步" + i + "位置能否到达数组末尾");
			if (i + A[i] >= A.length - 1) {
				// i位置直接经过A[i]步可以到达数组末尾
				System.out.println("从第" + i + "位置可以到达数组末尾");
				return true;
			} else {
				// 不能直接到达,查看可到达的位置是否可达
				if (canJumpPosition(i + A[i], A) == true) {
					return canJumpPosition(i + A[i], A);
				} else {
					continue;
				}
			}
		}
		// 循环结束,说明不能到达数组末尾,所以返回false
		return false;
	}
可是提交时不能AC,有一个input总是提示time limit exceeded,我在自己机子上运行它的input最多也就1ms,为什么会超时呢,不解,欢迎讨论。

以下是网上的方法:

算法思想:遍历数组,curMax记录当前位置可以到达的最远位置,用max记录所有以前步骤里可以到达的最远位置,在遍历过程中如果i>max,说明遍历到了不可以到达的位置,     返回false,如果出现max>=数组最大下标,返回true,说明存在这么个方式可以到达末尾

public boolean canJump(int[] A) {
		if (A.length <= 1)
			return true;
		int curMax = 0;
		int max = 0;
		for (int i = 0; i < A.length - 1; i++) {
			if (i > max)
				break;
			curMax = A[i] + i;
			if (curMax > max) {
				max = curMax;
			}
			if (max >= A.length - 1)
				return true;
		}
		return false;
	}


方法二简单多了,思想也很简单,我自己写的过于复杂(用了太多的时间),还是遇到的问题太少。继续努力。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值