55. Jump Game

来源:互联网 发布:新版淘宝联盟 编辑:程序博客网 时间:2024/06/06 08:54

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.


题意为给定一个非负数组成的序列,其中序列中的每个数表示可以跳跃的位移。假如遍历每个序列,取每次的和或者当前序列的值的最大值,假如能达到大于或者等于数组最后一个下标,那么就表示可以跳到数组末尾,这就是贪心法,代码如下:

Code(LeetCode运行13ms):

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


或者从数组的尾部开始倒回来,假如能到达数组开头,则表示can jump。用index表示下标能到达的位置,遍历序列的值,假如当前下标加上当前序列的值大于等于index的话,那么表示能到达index,所以把index设置成i,表示假如顺序走的话,会走到i,代码如下。

Code(LeetCode运行16ms)

bool canJump(vector<int>& nums) {        int index = nums.size() - 1;        for (int i = nums.size() - 2; i >= 0; i--) {            if (i + nums[i] >= index) {                index = i;            }        }        return index == 0;    }


或者用动态规划也可以做,但是要花费O(n)的空间去保存状态,但是也可以只用两个int变量来保存上一个状态和当前状态。其中状态转移方程为:

f[n] = max (f[n -1], nums[n - 1])

所以代码如下。

Code(LeetCode运行12ms)

bool canJump(vector<int>& nums) {        int f1 = 0, f2 = 0;        for (int i = 1; i < nums.size(); i++) {            f2 = max(f1, nums[i - 1]) - 1;            if (f2 < 0) {                return false;            }            f1 = f2;        }        return f2 >= 0;    }

以上代码的时间复杂度都为O(n),空间复杂度为O(1)。




原创粉丝点击