博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
403. Frog Jump
阅读量:4646 次
发布时间:2019-06-09

本文共 1964 字,大约阅读时间需要 6 分钟。

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;                    }}

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

转载于:https://www.cnblogs.com/reboot329/p/5883750.html

你可能感兴趣的文章
【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法
查看>>
【HANA系列】SAP HANA XS使用JavaScript数据交互详解
查看>>
【HANA系列】SAP HANA SQL获取上周的周一
查看>>
对称矩阵
查看>>
轮播图笔记!
查看>>
值类型与引用类型
查看>>
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
查看>>
PAT 1023 Have Fun with Numbers[大数乘法][一般]
查看>>
三维空间中的几种坐标系
查看>>
乘法表
查看>>
4.express 框架
查看>>
Java基础算法集50题
查看>>
Android 桌面组件widget
查看>>
25-字符串
查看>>
萌新报道
查看>>
Asp.Net 获取物理路径
查看>>
Apache2.4使用require指令进行访问控制--允许或限制IP访问/通过User-Agent禁止不友好网络爬虫...
查看>>
Solr reRankQuery加自定义函数实现搜索二次排序
查看>>
latex学习(四)tlmgr
查看>>
centos6.5 bugzilla4.4.5 汉化
查看>>