55. Jump Game(dp, 贪心)

来源:互联网 发布:一知f君2月13号 编辑:程序博客网 时间:2024/06/06 09:37

https://leetcode.com/problems/jump-game/description/

题目:判断是否可以跳到最后一个节点?

解法一:只要有一个可达的子节点能够到达最后一个节点,该节点即可到达最后一个子节点,否则无法到达。我们从后往前遍历。 例如: (0表示不可达,1表示可达)

          3   2  1  0  4          0   0  0  0  1

所以我们得出不可达。

class Solution {public:    bool canJump(vector<int>& nums) {        int len=nums.size(),temp;        int *B=new int[len];         for(int x=len-1;x>=0;x--)  {            B[x]=(x==len-1)?1:0;            for(int y=1;y<=nums[x]&&x+y<len;y++){                if(B[x+y]==1){                    B[x]=1;                    break;                }            }        }        temp=B[0];        delete [] B;        return temp;    }};

解法二:贪心。

这里写图片描述

黑色即为 fast 。黄线表示fast内部的线,我们并不需要考虑内部线,因为对于1号节点来说,它可以到达2,3号节点,但是后面我们会再一次判断2,3号节点。所以会重复,因此我们每次只需要考虑fast以外的点即可。

class Solution {public:    bool canJump(vector<int>& nums) {        int fast=nums[0],len=nums.size();        for(int x=1;x<len;x++)                fast=(x<=fast&&x+nums[x]>fast)?x+nums[x]:fast;        return fast>=len-1;    }};
原创粉丝点击