403. Frog Jump
做完了终于可以吃饭了,万岁~
假设从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;
}
}
感觉难在用数学式子证明如果小于最大,大于最小一定有解,但是我数学太差,就不丢人了。
403. Frog Jump的更多相关文章
- [leetcode]403. Frog Jump青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- [LeetCode] 403. Frog Jump 青蛙跳
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- [leetcode] 403. Frog Jump
https://leetcode.com/contest/5/problems/frog-jump/ 这个题目,还是有套路的,之前做过一道题,好像是贪心性质,就是每次可以跳多远,最后问能不能跳到最右边 ...
- 第十七周 Leetcode 403. Frog Jump(HARD) 线性dp
leetcode403 我们维护青蛙从某个石头上可以跳那些长度的距离即可 用平衡树维护. 总的复杂度O(n^2logn) class Solution { public: bool canCross( ...
- 403 Frog Jump 青蛙过河
一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中.给定石子的位置列表(用单元格序号升序表示), 请判定 ...
- 【leetcode】403. Frog Jump
题目如下: 解题思路:我的做法是建立一个字典dic,key为stone,value是一个set,里面存的是从前面的所有stone跳跃到当前stone的unit集合.例如stones=[0,1,2,3] ...
- [LeetCode] Frog Jump 青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- Frog Jump
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- Leetcode: Frog Jump
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
随机推荐
- 数据库(学习整理)----7--Oracle多表查询,三种join连接
聚合函数:(都会忽略null数据) 常用的有5种:将字段中所有的数据聚合在一条中 .sum(字段名) :求总和 .avg(字段名) :求平均值 .max(字段名) :求最大值 .min(字段名) :求 ...
- Codevs 4768 跳石头 NOIP2015 DAY2 T1
4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...
- 解决打不开jar包
Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于H ...
- php中如何实现网上商城用户历史浏览记录的代码
/如是COOKIE 里面不为空,则往里面增加一个商品ID if (!empty($_COOKIE['SHOP']['history'])){ //取得COOKIE里面的值,并用逗号把它切割成一个数组 ...
- ecmall 后台导航增加菜单
以我增加的团购为例: languages\sc-gbk\admin 中的default.lang.php 文件中底部增加变量值 'groupbuy'=>'团购', 'groupbuyord ...
- root 密码丢失后的重新设置
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables & mysql> use mysql; mysql> update use ...
- jquery学习之旅
在jQuery中,css()方法的功能是设置或获取元素的某项样式属性. $<"div">.css("font-weight","bold& ...
- 通过javascript实现页面的横竖屏固定
javascript是不能固定页面是横屏还是竖屏的,但是我们可以通过另外一种思路来监听window.orientation状态,假设我们要固定页面为横屏显示,则当window.orientation返 ...
- 使用linux的GDB打印STL(vector,map,set..................)
在linux用gdb或者cgdb计较不爽的地方是无法打印STL的东西,所有啊去网上找了找解决方案https://www.douban.com/note/182826844/?qq-pf-to=pcqq ...
- 配有Tesla K40c的服务器新装Ubuntu16.04并安装CUDA8.0、Anaconda3、Matlab2016a、OPENCV3.1、CuDNN5.1、MXNet
注:本文原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) 决定加入深度学习的大军,感谢导师给配了台新设备!第一次接触服务器并配置开发环境,整个过程中 ...