LeetCode--55.跳跃游戏(贪心,零点跳跃)

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

在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104653660