跳跃游戏

题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃

的最大长度。判断你是否能够到达最后一个位置。

1、暴力解法(超时)

	boolean flag = false;
	public void jump(int[] nums, int start)
	{
		int newStart = 0;
		if (start > nums.length-1)
			return;
		
		if (start == nums.length-1) // 到达了最后一个位置
			flag = true;
		
		for (int i=1; i<=nums[start]; i++)
		{
			newStart = start + i; // 这里不能改变start的值
			jump(nums, newStart);
		}
	}
	
	
	public boolean canJump(int[] nums)
	{
		jump(nums, 0);
		return flag;
	}

 优化后(备忘录),还是超时

	boolean flag = false;
	int[][] memo = null; // 备忘录
	boolean satisfy = true;
	public void jump(int[] nums, int start)
	{
		int newStart = 0;
		if (start > nums.length-1)
			return;
		
		if (start == nums.length-1) // 到达了最后一个位置
		{
			flag = true;
			satisfy = false; // 找到一个满足条件的解就结束
			return;
		}
			
	
		for (int i=1; i<=nums[start] && satisfy; i++)
		{
			if (memo[start][i] != 0) // 表示该状态已经算过
				continue;
			memo[start][i] = start + i; // 这里不能改变start的值
			jump(nums, memo[start][i]);
		}
	}
	
	
	public boolean canJump(int[] nums)
	{
		int maxVal = Integer.MIN_VALUE;
		for (int i=0; i<nums.length; i++)
		{
			maxVal = maxVal > nums[i] ? maxVal : nums[i];
		}
		// 初始化备忘录
		memo = new int[nums.length][maxVal+1]; // 默认值是0
		jump(nums, 0);
		return flag;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值