LeetCode--55.跳跃游戏(C)
程序员文章站
2022-06-03 11:34:08
...
1. 题目描述
难度:中等
2. 题目分析
这道题很有意思,我们需要知道的有这么几点:
- 如果输入的数组每一位都是大于0的数,那么肯定能跳到最后的位置(比如每个位置就向前跳1)
- 如果数组中出现0,那么除非该元素之前有能跳过这个零点的元素,否则无论如何也到不了最后一个
所以实现的方法有两种:
-
零点跳跃法
根据以上两条题目分析,对数组进行判断,如果所有元素都是大于0的数,那么返回TURE。如果出现0,那就判断前面是否有元素可以跨过这个0元素,如果不能,就返回false。时间复杂度最好的情况是O(n),最坏情况是O(n^2) -
贪心算法
从左到右遍历数组,计算每一步所能到达的最大距离,并更新最大距离值。比较最大的距离和遍历的下标,如果下标始终小于等于最大距离,那么就能走到末尾,否则不可以。时间复杂度为O(n)
3. C语言实现
3.1 零点跳跃法
代码如下:
// 判断是否有元素能跳过零点,如果不能返回0
bool jugde(int* nums, int index){
int i;
for(i = index-1; i >= 0; i--){
if(nums[i]>(index-i)){
return 1;
}
}
return 0;
}
bool canJump(int* nums, int numsSize){
int i;
// 如果数组长度为1,直接返回1
if(numsSize == 1) return 1;
// 如果数组为空,返回0
if(nums[0] == 0) return 0;
for(i = 0; i < numsSize; i++){
// 判断是否有0元素,并且不再数组末尾
if(nums[i] == 0 && i != numsSize-1){
if(jugde(nums, i)==0)
return 0;
}
}
return 1;
}
运行结果为:
3.2 贪心算法
代码如下:
bool canJump(int* nums, int numsSize){
int k = 0;
for (int i = 0; i < numsSize; i++)
{
if(i > k) return false;
k = k>(i + nums[i])?k:(i + nums[i]);
}
return true;
}