Jump Game
Solution 1
之前的Jump Game II就是这个题的简化版本,也为这个题提供了一个有效的贪心策略思路:选择当前可到达的最远位置,就是从远点可以到达的最远位置(当前探索过程中)。那么这个题主要问题就是我们能不能到达最后一个位置,翻译到之前的那个题目就是:我们能从原点到达的最远位置是否有最后一个索引。所以需要改动一下下前一题的代码:
- 调整输出,只需要判定能够到达最后一个位置,就是看我们能够在贪心策略下到达最后一个位置即可
- 额外的判定逻辑,如果当前位置下出现了原地踏步的情形(其实就是唯一一种到达不了最后的情形),需要否定并跳出
并且我还发现了我之前的代码的一点点小瑕疵,不过无伤大雅。
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N为输入数据的个数,最坏情况逐个遍历
- 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态变量
class Solution {
public:
bool canJump(vector<int>& nums) {
bool flag = false;
for (int i = 0; i <= nums.size() - 1;) {
if (i + nums[i] >= nums.size() - 1) {flag = true; break;}
int tempMax = 0;
int tempMaxPos = i;
for (int j = i + 1; j <= i + nums[i] && j < nums.size(); j++) {
if (nums[j] != 0 && j + nums[j] >= tempMax) {
tempMax = nums[j] + j;
tempMaxPos = j;
}
}
if (tempMaxPos == i) { break; } // 原地踏步
i = tempMaxPos;
}
return flag;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def canJump(self, nums: List[int]) -> bool:
flag = False
i = 0
while i < len(nums):
if i + nums[i] >= len(nums) - 1:
flag = True
break
tmpMax, tmpMaxPos = 0, i
for j in range(i + 1, min(i + nums[i] + 1, len(nums))):
if nums[j] != 0 and j + nums[j] >= tmpMax:
tmpMax = nums[j] + j
tmpMaxPos = j
if tmpMaxPos == i: break
i = tmpMaxPos
return flag