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

LeetCode--45. 跳跃游戏Ⅱ(C)

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

1. 题目描述

难度:困难
LeetCode--45. 跳跃游戏Ⅱ(C)

2. 题目分析

该题目是LeetCode55.跳跃算法的进阶版,有以下几点需要注意:

  • 假设总可以到达数组的最后一个位置
  • 要使用最少的跳跃次数

有两种实现方式:

  • 最大跨越点算法
    找到能够到达最后一个元素的并且下标最小的点,也就是能达到最后一个元素的跨越程度的最大点。然后以此点开始,继续寻找能够到达此点的下标最小的点,知道找到的点的下标为0,也就是数组的首位。时间复杂度最好的情况是O(n),最坏情况是O(n^2)
  • 贪心算法
    从左到右遍历数组,计算每一步所能到达的最大距离,并更新最大距离值。当遍历的下标等于最大距离时,说明这个时候应该跳一步,直到遍历完数组。时间复杂度为O(n)

3. C语言实现

3.1 最大跨越点算法

代码如下:

// 寻找最大跨越点
int findMaxPoint(int* nums, int index){
    int i;
    for(i = 0; i < index; i++){
        if(nums[i]>= index-i)
            return i;
    }
    return i;
}
int jump(int* nums, int numsSize){
    int i, index, count;
    index = numsSize-1;
    count = 0;
    if(numsSize == 1) return 0;
    while(index != 0){
        index = findMaxPoint(nums, index);
        count++;
    }
    return count;
}

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

3.2 贪心算法

代码如下:

int jump(int* nums, int numsSize){
	// ans为要跳跃的次数	
    int ans = 0;
    // end是目前为止,之前的元素能够到达的最大的点
    int end = 0;
    // maxPos是不断更新的最大值
    int maxPos = 0;
    for (int i = 0; i < numsSize - 1; i++)
    {
        maxPos = nums[i]+i>maxPos?nums[i]+i:maxPos;
        // 当遍历的下标遇到end时,说明该跳跃一步了,ans加一
        if (i == end)
        {
            end = maxPos;
            ans++;
        }
    }
    return ans;
}

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

相关标签: # •Array