leetcode刷题之旅——55. Jump Game

        做过了贪心算法中比较简单的一道题,选择了这道通过率百分之二十多的题目,虽然也是middle,但是感觉比前面的那道题目难想很多。

题目大意:

        给定一个非负整数的数组,现在我们目的是要跳到最后一个数,我们现在的位置是第一个数字所在的位置。那么我们一次最大能条多少步呢?我们每次最大能跳的步数就是我们当前坐在位置的数字,比如我们现在所处的位置的数字是5,我们就可以选择往后跳5步或者比5小的步数。如果给定我们的这个数组可以有一种跳法跳到最后一个数字,我们就返回true,否则返回false。

例子:

        A = [2,3,1,1,4], return true.

        A = [3,2,1,0,4], return false.

算法:

        这道题目从头开始想是很难找到一种解决方法的,我们试着从目的点开始想一下这个问题。我们先试着去找目的点的前一个落脚点,这个落脚点要满足什么条件呢?很显然,就是它距离目的点的距离,必须小于等于它本身所代表的数字。只有能到达这一个点,才能到达最后的目的点。这样的话,我们就把这个落脚点作为目的点,再次寻找前一个落脚点,然后如果最后推到第一个点,就说明这个数组是对的。可能有人会提出疑问,如果我们不经过这一个点,而是经过前一个点到达目的点,那不是不用经过这一个点了吗?举个例子说:

             1 2 3 4 5

        假如说,我们找到的落脚点是4,但是可能4这个节点是推不倒开头的那个点的。而其实,我们通过3这个点是可以跳到开头的。其实,不存在这种情况,如果前一个点能到达目的点,那么他一定能够到达4这个目标点,然后到达最后一个点。这样的话,我们以4作为目的点的时候,3就会被选为落脚点。其实,我们利用了贪心算法,找出了所有可以作为落脚点的点,是最长的一条路径。这样做是没有问题的,而且时间复杂度为O(n)。

代码:

class Solution 
{
public:
    bool canJump(vector& nums) 
    {
        int i=nums.size()-1;
        for(int j=i-1;j>=0;j--) {
            if(nums[j]>=i-j) i=j;
        }
        if(i==0) return true;
        else return false;
    }
};




你可能感兴趣的:(c++)