Jump Game 的三种思路 - leetcode 55. Jump Game
Jump Game 是一道有意思的题目。题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置。
比如:
A = [2, 3, 1, 1, 4], return true.
一种走法是 0 - 2 - 3 - 4
,还有一种走法是 0 - 1 - 4
O(n ^ 2) 解法
一个很显然,几乎不用动脑的解法。
设置一个布尔数组f
,f[0] === true
表示 index === 0
这个位置能够到达,模拟每个位置的前进,最后判断 f[lastIndex]
的值。
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
var f = [];
f[0] = true;
nums.forEach(function(item, index, array) {
if (f[index]) {
var tmp = Math.min(array.length - 1, index + item)
for (var i = index + 1; i <= tmp; i++)
f[i] = true;
}
});
return f[nums.length - 1] ? false : true;
};
但是返回了无情的TLE,给出了一组TLE的数据,数组长度达到了25000,也就是复杂度达到了O(25000 ^ 2),虽然leetcode数据普遍很弱,但是这组TLE也是让我心服口服。
解法1,跪...
O(nlogn) 解法
方法总比困难多,联想到了树状数组中的染色问题。
我们可以把jump的过程看成是染色,还是从左到右枚举位置,比如枚举到 index=0
位置时,nums[0]=5
,也就是说从 index=0
的位置一直可以走到 index=5
的位置,那么我们可以把1~5这一段进行染色。当枚举到 index=1
时,如何判断能不能走到这一步呢?只需求该点被染色的次数,如果大于0,那么就是能到达,然后从该点向后继续染色,最后判断最后一点有没有被染色即可。复杂度 O(nlongn)
。
/**
* @param {number[]} nums
* @return {boolean}
*/
var sum, n;
function lowbit(x) {
return x & (-x);
}
function update(index, val) {
while (index) {
sum[index] += val;
index -= lowbit(index);
}
}
function getAns(index) {
var ans = 0;
while (index <= n) {
ans += sum[index];
index += lowbit(index);
}
return ans;
}
var canJump = function(nums) {
sum = [];
sum[1] = 1;
n = nums.reduce(function(pre, item, index) {
return Math.max(pre, item + index + 1);
}, 0);
for (var i = 2; i <= n; i++)
sum[i] = 0;
for (var i = 0, len = nums.length; i < len; i++) {
var isPainted = getAns(i + 1); // 是否被染色
if (!isPainted) continue;
update(i + 1 + nums[i], 1);
update(i, -1);
}
return Boolean(getAns(len));
};
O(n) 解法
用树状数组显然大材小用了,树状数组可以求得被染色的次数,但是本题只需要判断是否被染色即可;而且本题每次染色都是一次。
进一步思考,我们枚举每一位时都在判断是否被染色过(从而决定是否能够到达该点且能否继续往前走),假设在某一瞬间,index=m
的位置已经被染色了,那么 index=n (n<=m)
的位置肯定已经被染色过了,我们维护一个最右边被染色的点,如果当前枚举点在该点的左侧,那么当前点已经被染色,否则即可停止遍历(因为右边的点再也不可能被染色到了)。
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
var rightMost = 1;
for (var i = 0, len = nums.length; i < len; i++) {
if (rightMost < i + 1) break;
rightMost = Math.max(rightMost, i + 1 + nums[i]);
}
return rightMost >= len;
};
Jump Game 的三种思路 - leetcode 55. Jump Game的更多相关文章
- Maximal Rectangle [leetcode] 的三种思路
第一种方法是利用DP.时间复杂度是 O(m * m * n) dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度 代码例如以下: int maximalRectangle(vecto ...
- [LeetCode] 55. Jump Game 跳跃游戏
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- leetcode 55. Jump Game、45. Jump Game II(贪心)
55. Jump Game 第一种方法: 只要找到一个方式可以到达,那当前位置就是可以到达的,所以可以break class Solution { public: bool canJump(vecto ...
- 简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
- Java中实现十进制数转换为二进制的三种思路
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...
- Leetcode 55. Jump Game & 45. Jump Game II
55. Jump Game Description Given an array of non-negative integers, you are initially positioned at t ...
- leetcode 55 Jump Game 三种方法,回溯、动态规划、贪心
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [LeetCode] 55. Jump Game 解题思路
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- LeetCode 55. Jump Game (跳跃游戏)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
随机推荐
- Spring,hibernate,struts的面试笔试题及答案
Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation ...
- 编写一个Car类,具有String类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。
package com.hanqi.test; public class Car { //构造一个汽车的属性 private String name; //创建getter和setter方法 publ ...
- MDX函数(官方顺序,带示例)
MDX函数(官方顺序) 1. AddCalculatedMembers (MDX) 返回通过将计算成员添加到指定集而生成的集. 语法: AddCalculatedMembers(Set_Expres ...
- sql server 警报管理,实时监听数据库动向,运筹帷幄之中
工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...
- Python标准库(1) — itertools模块
简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数. itertools.chain(*iterable) ...
- Linux服务器下nginx的安全配置
1.一些常识 linux下,要读取一个文件,首先需要具有对文件所在文件夹的执行权限,然后需要对文件的读取权限. php文件的执行不需要文件的执行权限,只需要nginx和php-fpm运行账户的读取权限 ...
- windows环境下无法引用全局安装的模块问题
问题 在node项目中,往往需要安装一些依赖的包,通常我们采取全局安装的方式,来减少一些包重复安装带来的烦恼. 但是全局安装后出现无法使用的情况,可能是你NODE_PATH没有设置或者不正确造成的. ...
- linux批量删除进程
在虚拟机用脚本跑了几十个client程序用来测试服务器,然后发现参数设置错误,得重来,就傻眼了,不知道怎么关这么多client进程,总不能一个一个关.还好,学习一下,想出了以下的命令. ps -e ...
- Activity中使用Intent实现页面跳转与参数的传递(转)
新建一个FirstAvtivity.java package com.zhuguangwei; import android.app.Activity; import android.content. ...
- 【2016-10-14】【坚持学习】【Day5】【策略模式】
今天学了策略模式 例子 一个售票系统,针对不同的用户使用不用的计价方式, 环境类:一个业务场景(电影票累,) 抽象类:计价算法 具体实现类:5折算法,满100减20算法,..... 抽象策略类 abs ...