55. 跳跃游戏
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这个不动点也特别有意思,和题目里「无论怎样,总会到达……永远不可能到达……」的思路是一致的。