45. 跳跃游戏 II
难度中等
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2
。 从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4] 输出: 2
暴力:
class Solution { public: int dfs(vector<int>& nums, int index) { if (index >= nums.size()-1) return 0; int res = nums.size() ;// 随便弄个最大值 int step = nums[index]; for(int i = 1;i <= step;i++) { res = min(res,dfs(nums,index+i)+1); } return res; } int jump(vector<int>& nums) { return dfs(nums,0); } };
记忆:
class Solution { public: int dfs(vector<int>& nums, int index,vector<int>& memo) { if (index >= nums.size()-1) return 0; if (memo[index]!=nums.size()) return memo[index]; int res = nums.size() ;// 随便弄个最大值 int step = nums[index]; for(int i = 1;i <= step;i++) { res = min(res,dfs(nums,index+i,memo)+1); } memo[index] = res; return res; } int jump(vector<int>& nums) { vector<int> memo(nums.size(),nums.size()); return dfs(nums,0,memo); } };
class Solution { public: //The main idea is based on greedy. Let's say the range of the current jump is [curBegin, curEnd], curFarthest is the farthest point that all points in [curBegin, curEnd] can reach. Once the current point reaches curEnd, then trigger another jump, and set the new curEnd with curFarthest, then keep the above steps, as the following: int jump(vector<int>& nums) { int max_far = 0;// 目前能跳到的最远位置 int step = 0; // 跳跃次数 int end = 0; // 上次跳跃可达范围右边界(下次的最右起跳点) for (int i = 0; i < nums.size() - 1; i++) { max_far = std::max(max_far, i + nums[i]); // 到达上次跳跃能到达的右边界了 if (i == end) { end = max_far; // 目前能跳到的最远位置变成了下次起跳位置的有边界 step++; // 进入下一次跳跃 } } return step; } };
class Solution { public: int jump(vector<int>& nums) { int cur_max_len = 0; int next_max_len = 0; if(nums.size()==1) return 0; int res = 1; for(int i = 0; i < nums.size()-1;) { cur_max_len = max(cur_max_len,nums[i]+i); int next_index = i; if (cur_max_len >= nums.size()-1) break; for(int j = i;j <= cur_max_len;j++) { if (nums[j]+j>next_max_len) { next_index = j; next_max_len = nums[j]+j; } } i = next_index; res++; } return res; } };