LeetCode - 解题笔记 - 55 - Jump Game

Jump Game

Solution 1

之前的Jump Game II就是这个题的简化版本,也为这个题提供了一个有效的贪心策略思路:选择当前可到达的最远位置,就是从远点可以到达的最远位置(当前探索过程中)。那么这个题主要问题就是我们能不能到达最后一个位置,翻译到之前的那个题目就是:我们能从原点到达的最远位置是否有最后一个索引。所以需要改动一下下前一题的代码:

  1. 调整输出,只需要判定能够到达最后一个位置,就是看我们能够在贪心策略下到达最后一个位置即可
  2. 额外的判定逻辑,如果当前位置下出现了原地踏步的情形(其实就是唯一一种到达不了最后的情形),需要否定并跳出

并且我还发现了我之前的代码的一点点小瑕疵,不过无伤大雅。

  • 时间复杂度: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值