一:解题思路
方法一:Time:O(n),Space:O(n)
方法二:Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: int jump(vector<int>& nums) { if (nums.size() == 0) return -1; int n = nums.size(); int maxValue = 0; vector<int> d(n,0); for (int i = 0; i < n; i++) { if (maxValue >= n - 1) return d[n-1]; if (i > maxValue) return -1; maxValue = max(maxValue,i+nums[i]); int last = min(maxValue,n-1); for (int j = last; j > i && d[j] == 0; j--) d[j] = d[i] + 1; } return -1; } };
方法一Java:
class Solution { public int jump(int[] nums) { if(nums==null || nums.length==0) return -1; int n=nums.length; int[] d=new int[n]; int maxValue=0; for(int i=0;i<n;i++) { if(maxValue>=n-1) return d[n-1]; if(i>maxValue) return -1; maxValue=Math.max(maxValue,i+nums[i]); int last=Math.min(maxValue,n-1); for(int j=last;j>i && d[j]==0;j--) d[j]=d[i]+1; } return -1; } }
方法二C++:
class Solution { public: int jump(vector<int>& nums) { if (nums.size() == 0) return -1; if (nums.size() == 1) return 0; int n = nums.size(); int maxValue = 0; int jumps = 0, curEnd = 0; for (int i = 0; i < n; i++) { if (maxValue >= n - 1) return jumps+1; if (i > maxValue) return -1; if (i > curEnd) { jumps++; curEnd = maxValue; } maxValue = max(maxValue,i+nums[i]); } return -1; } };
方法二Java:
class Solution { public int jump(int[] nums) { if(nums==null || nums.length==0) return -1; if(nums.length==1) return 0; int jumps=0,curEnd=0; int n=nums.length; int maxValue=0; for(int i=0;i<n;i++) { if(maxValue>=n-1) return jumps+1; if(i>maxValue) return -1; if(i>curEnd) { jumps++; curEnd=maxValue; } maxValue=Math.max(maxValue,i+nums[i]); } return -1; } }