Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4]
, return true
.
A = [3,2,1,0,4]
, return false
.
Have you met this question in a real interview?
class Solution {
public:
/* algorithm : DFS
brute force,TLE error
*/
bool dfs(vector<int>&nums,int start){
if((start+1) >= nums.size())return true;
if(nums[start] == 0)return false;
for(int l = 1;l <= nums[start];l++){
if(dfs(nums,start+l))return true;
}
return false;
}
bool canJump(vector<int>& nums) {
return dfs(nums,0);
}
};
class Solution {
public:
/* algorithm : DP
dp[i]: whether it is reachable from i to end
dp(i) = 1 ;if for one k(0<=k<=nums[i]), dp[i+k]=1
time O(n*n) space O(n),still TLE,but accept more test cases
*/
bool canJump(vector<int>& nums) {
int n = nums.size();
vector<int>dp(n,0);
dp[n-1]=1;
for(int i = n - 2;i >= 0;i--){
for(int k = min(n-1-i,nums[i]);k > 0;k--){
if(dp[i+k]){
dp[i]=1;
break;
}
}
}
return dp[0];
}
};
class Solution {
public:
/* algorithm : DP
dp[i]: maximum remaing steps when we reach i
dp(i) = max(dp(i-1),A[i-1])-1
time O(n) space O(n)
*/
bool canJump(vector<int>& nums) {
int n = nums.size();
vector<int>dp(n,0);
dp[0] = nums[0];
for(int i = 1;i < n;i++){
dp[i] = max(dp[i-1],nums[i-1]) - 1;
if(dp[i] < 0)return false;
}
return dp[n-1] >= 0;
}
};
class Solution {
public:
/* algorithm : DP
dp[i]: maxium index that i element can reach
time O(n) space O(1)
*/
bool canJump(vector<int>& nums) {
int maxIdx = 0,n = nums.size();
for(int i = 0;i < n;i++){
if(i > maxIdx || maxIdx >= (n-1))break;
maxIdx = max(maxIdx,i+nums[i]);
}
return maxIdx >= (n-1);
}
};