leetcode刷题日记——跳跃游戏
[ 题目描述 ]:
[ 思路 ]:
- 题目要求在给出的每次可移动最大步数中选择一个移动步数,如果有一种选择能达到终点就返回true,如果没有一种选择能够达到终点就返回false
- 因为每次给出的最大步数不同,步数越大,也就使得探索空间变得更大,那么我们可以先缩小探索空间,再慢慢增加探索空间
- 例如 [2,3,1,1,4]
- 假设我们目前能探测只有nums[0],从nums[0]获取到两个步数,那么可以达到的距离变为index+2,即到nums[2],计算0~2中index+step的最大值也就是新的最大距离,然后在新的最大距离在中去寻找能够达到的最大距离;
- 如果能探索到的最大距离中没有能达到或超过数组长度-1的,即无法到达
- 如果能够达到或超过数组长度-1的,即能够到达
bool canJump(int* nums, int numsSize) {
int index=0,len=0;
while(index<=len&&index<numsSize){
if(index+nums[index]>len){
len=index+nums[index];
}
index++;
}
if(len>=numsSize-1) return true;
return false;
}
[ 优化 ]:
- 时间复杂度为O(n),空间复杂度为O(1)
[ 官方题解 ]:
- 一、贪心,即上述算法