LeetCode 55. 跳跃游戏
55. 跳跃游戏
难度中等
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
思路:从第一个数开始,判断该数字是否可以到达末尾,可以,返回true,不可以则向下一位判断。下面是本人写的,有些繁琐,因为提交了好几遍,补漏洞补出来的。
1 int max(int i,int j) 2 { 3 if(i>j) return i; 4 else return j; 5 } 6 bool canJump(int* nums, int numsSize) 7 { 8 if(numsSize==1){ 9 return true; 10 } 11 if(nums[0]==0){ 12 return false; 13 } 14 int i,m=nums[0]; 15 for(i=0;i<numsSize-1;i++){ 16 m=max(m-1,nums[i]); 17 if(m==0){ 18 return false; 19 } 20 if(m>=numsSize-1-i) 21 return true; 22 } 23 return false; 24 }
下面的是在评论区参观了大佬的思路:
1 bool canJump(int* nums, int numsSize){ 2 int max = nums[0]; 3 for(int i = 1; i < numsSize; ++i) { 4 if(i > max) { 5 return false; 6 } 7 if(i + nums[i] > max) { 8 max = i + nums[i]; 9 } 10 } 11 return true; 12 }
这道题从前面开始计算可以,从后面计算也可以。