欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode--55.跳跃游戏(C)

程序员文章站 2022-06-03 11:34:08
...

1. 题目描述

难度:中等
LeetCode--55.跳跃游戏(C)

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;
}

运行结果为:
LeetCode--55.跳跃游戏(C)

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;
}

LeetCode--55.跳跃游戏(C)

相关标签: # •Array