//dp 通过全部用例 超时 classSolution { public: boolcanJump(vector<int>& nums){ int n = nums.size(); vector<bool> dp(n, false); dp[0] = true; for(int i = 0; i < n; i ++){ if(!dp[i]) continue; for(int j = 1; j <= nums[i] && i + j < n; j++){ dp[i + j] = true; } } return dp[n - 1]; } };
// AC classSolution { public: boolcanJump(vector<int>& nums){ int res = 0; // 能达到的下标 int n = nums.size(); for(int i = 0; i < n; i ++){ if(i > res) returnfalse; // 到了达不到的下标,不能再继续下去 res = max(nums[i] + i, res); } return res >= n - 1; } };
classSolution { public: intjump(vector<int>& nums){ int res = 0; // 到达nums[n - 1]的最少步数 int begin = 0; int end = 1; // end 是 该轮最末尾的位置 while(end < nums.size()){ int maxReach = 0; for(int i = begin; i < end; i ++){ // 如果将end初始化为0的话,第一轮不会展开,出现runtime error maxReach = max(nums[i] + i, maxReach); } begin = end; end = maxReach + 1; res ++; } return res; } }; // 执行用时:12 ms, 在所有 C++ 提交中击败了76.15%的用户 // 内存消耗:16 MB, 在所有 C++ 提交中击败了96.52%的用户