题意:
给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。
如果能够跳到数组最后一个位置,则返回true,否则返回false。
方法一:
贪心
思路:用一个变量ma 表示(可达下标的最大值),初始化ma=0。
循环遍历数组,更新并维护 ma 的最大值。
当ma>=n-1时,则说明可以到达数组的最后一个位置。
class Solution { public: bool canJump(vector<int>& nums) { int n=nums.size(); int ma=0;//初始化下标的最大值 for(int i=0;i<n&&i<=ma;i++){ ma=max(ma,i+nums[i]);//维护下标的最大值 } if(ma>=n-1){ return true; } return false; } };
时间复杂度:空间复杂度:
方法二:
暴力(超时)
思路:vis[ ]数组表示某位置是否可达。
初始化vis[0]=1,表示0位置可达。
遍历数组的每个元素,如果该位置可达,则从该位置出发,遍历所有可达的点并置vis[ ]为1;最后判断数组的最后一个位置是否可达。
class Solution { public: bool canJump(vector<int>& nums) { int n=nums.size(); int vis[200005]={0};//判断某位置是否可达 vis[0]=1;//初始化下标0位置是可达的 for(int i=0;i<n;i++){ if(vis[i]==1){//如果该位置可达,则从该位置出发,遍历所有可达的点并置vis[]为1 for(int j=1;j<=nums[i];j++){ if(i+j<n) vis[i+j]=1; } } } if(vis[n-1]==1){//最后判断数组的最后一个位置是否可达 return true; } return false; } };
时间复杂度:空间复杂度: