55. Jump Game

来源:互联网 发布:淘宝里的旺旺号是什么 编辑:程序博客网 时间:2024/04/30 13:11

此题有两种解法,分别为DP和贪心,DP的算法复杂度为O(N^2),贪心的算法复杂度为O(N)。先介绍DP。

DP解法:

此题为一维DP。d[i]表示能不能跳到i处,要是能跳到,则再把从i处能跳到的别的地方全设置为true了。这样扫描一遍数组就可以了。代码如下:

class Solution {public:    bool canJump(vector<int>& nums) {        int n = (int)nums.size();        bool* d = new bool[n]();        d[0] = true;        for (int i = 0; i < n; i++) {            if (d[i] == true) {                for (int j = 1; j <= nums[i]; j++) {                    if (i + j < n)                        d[i + j] = true;                }            }        }        return d[n - 1];    }};

但是这个解法是TLE的,算法是两层循环,会进行很多重复操作(比如到j,从i已经跳到它过了,但是i+1也能跳到它,所以设置d[j]为true)。没必要把每个i能走到哪些地方都算出来,只要算出最后一跳能不能>=n-1就行了,也就是下面所说的贪心法。

贪心法:

只需要顺序扫描数组,记录下能够到达的最远位置。代码如下:

class Solution {public:    bool canJump(vector<int>& nums) {                int canArrive = 0, n = (int)nums.size();//canArrive为当前能到达的最远位置        for(int i = 0; i <= canArrive && canArrive < n-1; i++)            if(i + nums[i] > canArrive)canArrive = i + nums[i];        return canArrive >= n-1;    }};






0 0
原创粉丝点击