<p>You are given a <strong>0-indexed</strong> array of integers <code>nums</code> of length <code>n</code>. You are initially positioned at <code>nums[0]</code>.</p>

<p>Each element <code>nums[i]</code> represents the maximum length of a forward jump from index <code>i</code>. In other words, if you are at <code>nums[i]</code>, you can jump to any <code>nums[i + j]</code> where:</p>

<ul>
	<li><code>0 &lt;= j &lt;= nums[i]</code> and</li>
	<li><code>i + j &lt; n</code></li>
</ul>

<p>Return <em>the minimum number of jumps to reach </em><code>nums[n - 1]</code>. The test cases are generated such that you can reach <code>nums[n - 1]</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [2,3,1,1,4]
<strong>Output:</strong> 2
<strong>Explanation:</strong> The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [2,3,0,1,4]
<strong>Output:</strong> 2
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>4</sup></code></li>
	<li><code>0 &lt;= nums[i] &lt;= 1000</code></li>
	<li>It&#39;s guaranteed that you can reach <code>nums[n - 1]</code>.</li>
</ul>

class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)

        if(len(nums) == 1):
            return 0

        if(nums[0]== 0):
            return -1 #we cannot go anywhere
        if(nums[0] >=n-1):
            return 1
        
        Min_jump_list = nums.copy()#[-1 for i in range(n)]
        Min_jump_list[-1] = 0
        
        #start from reverse
        # for i in range(n-1)[::-1]:
        for i in range(n-2,-1,-1):

            
            if(nums[i]==0):
                Min_jump_list[i] = float("inf")
                continue
            #forward jump from i  

            t = set(Min_jump_list[i+1 : min(i + nums[i]+1 , n) ])
            minjump = min(t) + 1
            Min_jump_list[i] = minjump

        #final
        # print(Min_jump_list)

        ans = Min_jump_list[0]
        if(ans == float("inf")):
            return -1
        return ans

class Solution:
    def jump(self, nums: List[int]) -> int:
        mx,count,curr=0,0,0
        for i in range(len(nums)-1):
            if i+nums[i]>mx: mx=i+nums[i]
            if i==curr: curr,count=mx,count+1 
        return count
16900