leetcode403 frog-jump

题目:https://leetcode-cn.com/problems/frog-jump/

思路:深搜 (注意超时)

用数组dp[][]记录一些情况,避免重复计算。比如dp[i][j]表示前一块石头是i,下一块石头是j,这种情况是不是已经计算过了,如果计算过了就不往下计算。

class Solution {
        boolean flag = false; //记录是否可行,一旦得到一种可行的情况,flag = true;
        int [] stones ;
        int len ;
        boolean dp[][]; //dp[i][j] 表示前一步是i,跳到j,是否已经计算过结果
        int check(int i,int j,int step)
        {
            if(stones[i] + step == stones[j]) return 0;
            if(stones[i] + step - 1 == stones[j]) return -1;
            if(stones[i] + step + 1 == stones[j]) return 1;
            return -2;
        }
        void dfs(int pre,int now,int step)//深搜,上一个石头是pre,现在的石头是now,跨度 step
        {
            if(dp[pre][now]) {//之前计算过了,不往下遍历
                return;
            }
            dp[pre][now] = true; //标记
            if(now==len-1){ //成功,直接返回
                flag = true;
                return;
            }
            for(int j=now+1;j<len;j++) //遍历下一块石头
            {
                int tmp = check(now,j,step); //检查两个石头之间的间隔是否符合题意要求
                if(tmp!=-2)
                {
                    dfs(now,j,step+tmp);//跳向下一个石头
                    if(flag) { 
                        return;
                    }
                }
            }
        }
        public boolean canCross(int[] stones) {
            this.stones = stones;
            this.len = stones.length;
            if(stones[1]!=1) return false;//第二个石头不是1,直接返回
            
            this.dp = new boolean [len+1][len+1]; //开始深搜
            dfs(0,1,1);
            return flag;
        }
    }//84.27%   29.41% 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值