403. Frog Jump

image
做完了终于可以吃饭了,万岁~

假设从stone[i]无法跳到stone[i+1]:
可能是,他们之间的距离超过了stone[i]所能跳的最远距离,0 1 3 7, 从3怎么都调不到7;
也可能是,他们之间的距离小于stone[i]能跳的最近距离,0 1 3 6 10 11,从10无法挑到11;

那么有没有可能下一个石头到当前的距离,小于最大值,大于最小值,因为中间有空白让我正好跳不到?(突然发现自己变成青蛙了)

我没用严谨的数学公式证明,但是写了几个式子发现不存在这种情况,如果出现,那么在i之前就判断失败了。

所以动态规划就要一个最大值,一个最小值:

max[i]表示在石头stone[i]上,最远能跳多远;
min[i]就是最近跳多近。

最小的距离要从最近的石头开始找,stone[i-1],stone[i-2]..一旦找到就停止。
判断最近的石头能不能跳过来,就是开始说的石头之间的距离<=max[i-1] && >= min[i-1]。跳过来那么最短距离就是当前俩石头之间的距离diff-1,减1是因为下次跳是k-1,k,k+1。

最大的距离就是从最远的石头stone[1]开始找,一旦成功就停止。

假设有一块石头能跳到当前,那么上面2个值就都存在,就是那块石头到当前石头的距离-1 +1;一块都没有,max[i] min[i]就都是初始的值,Java里面是0.

一但出现max[i] == 0 min[i] == 0就说明跳不到。一直遍历到最后就行了。

代码速度AC了,也是没仔细想,肯定能改进,比如中间的找最大最小可以用二分之类的。。

public class Solution {
    public boolean canCross(int[] stones) 
    {
        if(stones.length == 1) return true;
        if(stones[1] != 1) return false;
        
        int[] max = new int[stones.length];
        int[] min = new int[stones.length];
        max[0] = 1;min[0] = 1;
        max[1] = 2;min[1] = 1;
        
        
        for(int i = 2; i < stones.length;i++)
        {
            int L = 1;
            int R = i-1;
            int target = 0;
            
            //find mini
            while(R > 1)
            {
                target = stones[i] - stones[R];
                if(max[R] >= target && min[R] <= target)
                {
                    min[i] = Math.max(target - 1,1);
                    break;
                }
                else R--;
            }
            while(L <= R)
            {
                target = stones[i] - stones[L];
                if(max[L] >= target && min[L] <= target)
                {
                    max[i] = target + 1;
                    break;
                }
                else L++;
            }
            if(max[i] == 0 && min[i] == 0) return false;
            
            
        }
        
        return true;
        
        
    }
}

感觉难在用数学式子证明如果小于最大,大于最小一定有解,但是我数学太差,就不丢人了。

posted @ 2016-09-19 05:30  哇呀呀..生气啦~  阅读(319)  评论(0编辑  收藏  举报