力扣 题目45- 跳跃游戏 II
题目
1 45. 跳跃游戏 II 2 给你一个非负整数数组 nums ,你最初位于数组的第一个位置。 3 4 数组中的每个元素代表你在该位置可以跳跃的最大长度。 5 6 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 7 8 假设你总是可以到达数组的最后一个位置。 9 10 11 12 示例 1: 13 14 输入: nums = [2,3,1,1,4] 15 输出: 2 16 解释: 跳到最后一个位置的最小跳跃数是 2。 17 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 18 示例 2: 19 20 输入: nums = [2,3,0,1,4] 21 输出: 2 22 23 24 提示: 25 26 1 <= nums.length <= 104 27 0 <= nums[i] <= 1000
题解
方法1 (建议使用方法2 方法1只记录我个人的思路!)
ps:本来以为我这个方法很好了 没想到只打败了%10呜呜呜
即记录一下跳到该下标时最小的次数 然后继续跳跃到其他下标
创建一个二维数组loop
以2,3,1,1,4为例
一开始是在下标为0此时次数为0 0放入loop[0]

此时nums[0]=2;
所以我们将loop[0]+1放入nums[0+1]和nums[0+2]

看loop[1]=3; 所以我们将loop[1]+1放入nums[1+1] nums[1+2] nums[1+3]

看loop[2]发现此时 竟然有两个 分别是1 ,2 一想就知道肯定选择小的 (跳了两次和跳了一次)
这样重复上面操作 直接取最后一行最小的即可
但是仔细想想是不是放入最后一行的第一个数就是最小了呢?答案是yes
所以我们当最后一行被放入时 就取这个值即可
方法2
贪心算法(具体可以移步至力扣评论区 这里不说了)
代码1
1 #include<iostream> 2 #include<vector> 3 #include<set> 4 #include <algorithm> 5 using namespace std; 6 int jumpnum(vector<int>& nums, vector<int>& loop, int position) { 7 //循环一遍 8 for (; position < nums.size() - 1; position++) { 9 //根据nums[position]发生跳跃 记得position + i < nums.size() 10 for (int i = 1; i < nums[position] + 1 && position + i < nums.size(); i++) { 11 //比较最小值 放入 12 loop[position + i] = min(loop[position + i], loop[position]+1); 13 //如果最后一行被填入 直接退出 14 if ((position + i) == nums.size() - 1) { 15 return 0; 16 } 17 } 18 } 19 return 0; 20 } 21 class Solution { 22 public: 23 int jump(vector<int>& nums) { 24 //全部最大用来比较 25 vector<int> loop(nums.size(),INT_MAX); 26 //下标为0时 跳跃次数为0 27 loop[0] = { 0 }; 28 jumpnum(nums, loop, 0); 29 return loop.back(); 30 } 31 }; 32 int main() { 33 Solution sol; 34 vector<int> nums = { 2,3,1,1,4 }; 35 int num = sol.jump(nums); 36 cout << num << endl; 37 38 }
代码2
1 #include<iostream> 2 #include<vector> 3 #include<set> 4 #include <algorithm> 5 using namespace std; 6 class Solution { 7 public: 8 int jump(vector<int>& nums) { 9 if (nums.size() == 1) return 0; 10 int reach = 0; 11 int nextreach = nums[0]; 12 int step = 0; 13 for (int i = 0; i < nums.size(); i++) { 14 nextreach = max(i + nums[i], nextreach); 15 if (nextreach >= nums.size() - 1) return (step + 1); 16 if (i == reach) { 17 step++; 18 reach = nextreach; 19 } 20 } 21 return step; 22 } 23 }; 24 int main() { 25 Solution sol; 26 vector<int> nums = { 2,3,1,1,4 }; 27 int num=sol.jump(nums); 28 cout << num << endl; 29 30 }

浙公网安备 33010602011771号