力扣 题目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 解释: 跳到最后一个位置的最小跳跃数是 217      从下标为 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
View Code

题解


方法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 }
View Code

代码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 }
View Code

 

posted @ 2022-05-08 14:50  无聊的阿库娅  阅读(52)  评论(0)    收藏  举报