[LeetCode] 55. Jump Game

来源:互联网 发布:网络调查 编辑:程序博客网 时间:2024/06/11 01:08

Problem :

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:


A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.


题意分析:给定一个数组,从下标0开始走,判断是否能到达最后一个位置(即下标为nums.size()-1的位置),

其中每个数组元素代表在当前位置能移动的最大距离。


对给出的第一个例子,第一个位置能移动的最大距离为2,即下一步可以移动至A[1]或者A[2],若移动到A[1],

由于下一步能移动的最大距离为3,因此可以移动至数组的最后一个下标(判为true);若移动到A[2],由于

后两个数组元素均为1,因此容易判断最终能移动到数组末。


而第二个例子给出的数组,无论第一步怎么移动,都跨不过数组的第四个位置(下标为3的位置),而该位置

能移动的最大距离为0,即不能移动,易知结果应判为false。


解题思路:本题可以通过贪心求解,贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是

最好的选择。也就是说,不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解


对于本题,我们已知在每个位置能移动的最大距离,我们通过currentIndex来记录在每个位置能移动能到达的最大

下标,这个距离越大就越接近终点(即记录局部的最优解),更新这个值的唯一条件是:找到一个能移动到比这个

下标值更大的值。


如何判断最终能否到达数组最后一个下标位置呢?

能遍历完整个数组,即不会出现在某个位置,下标值 (i) > 记录的能移动到的最大下标值(currentIndex)


Solution :

class Solution {public:    bool canJump(vector<int>& nums) {        int currentIndex = 0;        for (int i = 0; i < nums.size(); i++) {            if (i <= currentIndex) {                currentIndex = max(currentIndex, i + nums[i]);            } else {                break;            }        }        return (i == nums.size());    }};


另外提供一个基于逆向思维的解法,同样是应用贪心算法的思想:https://discuss.leetcode.com/topic/3443/simplest-o-n-solution-with-constant-space

关于贪心算法的详细参见:贪心算法-百度百科