55. 跳跃游戏

55. 跳跃游戏 - 力扣(LeetCode)

class Solution {
public:
  bool canJump(vector<int>& nums) {
    int N = nums.size();
    int Rightmost = 0;
    for (int i = 0; i < N; ++i) {
      // i itself is reachable?
      if (i <= Rightmost) {
        Rightmost = std::max(Rightmost, i + nums[i]);
        // Last index is reachable?
        if (Rightmost >= nums.size() - 1)
          return true;
      }
    }
    return false;
  }
};

只能说你别看这题是贪心,实际上贪心的门道也是很多的。反正我确实是想不出来这个解法。

不过两道贪心题目做下来感觉,似乎贪心问题一般都需要一个 GlobalVal 来记录某件事情的「全局最值」。接下来继续做的时候观察观察。

二刷

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

我操,我这个写得比一刷简洁啊,而且i > MaxDistance这个不动点也特别有意思,和题目里「无论怎样,总会到达……永远不可能到达……」的思路是一致的。