403. Frog Jump

403. Frog Jump
青蛙过河

题目:
一只青蛙正在横渡一条河。这条河分为X个单元,每一个单元可能有或者没有一块石头。青蛙只能跳到石头上而不能跳进水中。
注意:
给定一个升序排列的石头的位置(单元),判断青蛙能否通过登陆最后一块石头成功过河。
初始时,青蛙在第一块石头上,并且假设第一次跳跃必须是一个单元。如果青蛙的最后一次跳跃是k个单位,那么它的下一跳必须是k-1,k,k+1个单位。青蛙只能向前跳。
解题思路:
我们定义一个helper(int[] stones,int i,int step,HashMap<Integer,Boolean>map)函数:青蛙在第i个石头上,目前可以跳跃step步数的情况下,是否能过河。
注意:如果不用map表示的话,会造成超时。
代码:
class Solution
{
	public boolean canCross(int[] stones)
	{
		if(stones==null || stones.length==0) return true;
		if(stones[1]>1) return false;
		if(stones.length==2) return true;
		
		HashMap<Integer,Boolean>map=new HashMap<Integer,Boolean>();
		return helper(stones,1,1,map);
	}
	public boolean helper(int[] stones, int i, int step, HashMap<Integer,Boolean>map)
	{
		//k代表的是i和step,用step左移多位再或上i表示,这样不会产生冲突
		int key=i | step<<11;
		if(i==stones.length-1) return true;
		//如果这种情况已经出现过了,则直接返回结果
		if(map.containsKey(key)) return map.get(key);
		
		for(int j=i+1;j<stones.length;j++)
		{
			if(stones[j]<stones[i]+step-1) continue;
			if(stones[j]>stones[i]+step+1) {map.put(key,false); return false;}
			if(helper(stones, j, stones[j] - stones[i],map))
                { map.put(key, true); return true;}	
		}
		 map.put(key,false);
		 return false;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值