Leetcode(W6):55. Jump Game

前言:时间都去哪了。


1. Jump Game

介绍:

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.

题意:

非负的数组,每个元素代表当前下标所能“JUMP”的最远步数,而我们的目标就是要到达数组的尾端,也就是数组的最后一个下标。

举例:

A = [2,3,1,1,4], return true.
B = [3,2,1,0,4], return false.
对于A,下标0是2,所以最远能走2步,最远能到达下标2。注意这里的最远,理清题意,贪心算法虽然是每次都取局部最优解,但这个局部最优解可能不在最远的下标,就像这里,很明显,下标1才能走到最远,下标1走三步能到下标4,即能直接走到终点,所以返回true。

思路:

思路在举例那其实说得差不多了,就是利用贪心算法,设一个变量reach记录能到达的最远的下标,然后最后比较一下reach跟(数组的长度-1)大小即可,如果大于等于,则代表能到达。
怎样计算这个reach就是贪心算法的事了,reach可以初始化为第一个元素,然后循环,i从下标1开始循环到最后一个下标,每次计算一下当前下标的值加这个下标对应的元素的值(i+array[i]),这个和即为这个下标所能到达的最远的下标,将这个和与当前reach相比较,谁大就谁保存在reach中即可。
需要注意的另一个终止循环条件是,每次新的下标都要跟reach比较,如果比reach小,说明根本走不到这个位置,也就可以终止循环了。

操作:

都在代码注释了。

2. 代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int reach = 0 + nums[0];//起点能到达的下标的地方,reach保存当前最远的能走的下标 
        for(int i = 1; i <= nums.size()-1 && reach >= i; i++) {
        //遍历条件:1、i只能走到终点;2、能走到i 
            if (i + nums[i] > reach) {//每次能走更远就选择更远 
                reach = i + nums[i];  
            }
        }
        return reach >= (nums.size()-1) ? true : false;  
    }
};

你可能感兴趣的:(Leetcode)