45. 跳跃游戏 II
题目介绍
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
动态规划
使用一个一维数组dp来表示从0到i所需要的最少步数,
之后在遍历每个点 i 的时候,查看该点可以跳跃的步数 k,然后向前遍历 k 次并更新
d
p
[
i
+
k
]
=
m
i
n
(
d
p
[
i
]
+
1
,
d
p
[
i
+
k
]
)
dp[i+k] = min(dp[i]+1, dp[i+k])
dp[i+k]=min(dp[i]+1,dp[i+k])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class Solution { public: int jump(vector<int>& nums) { //dp数组,表示从0跳到i的最小步数 vector<int> dp(nums.size(), nums.size()); int i, j, k; dp[0] = 0; for(i=0; i<nums.size()-1; i++) { j = nums[i]; //i点可以跳的步数 for(k=1; k<=j && i+k < nums.size(); k++) { dp[i+k] = min(dp[i]+1, dp[i+k]); } } return dp[i]; } };
贪心算法
贪心算法掌握的不太好,因为总觉得它不能完美的达到全局最优解。
本题从左向右遍历,每次在该点 i 能跳到的范围内搜索,查看下一次能跳到的最远位置,并选择那个位置作为之后的起跳点。
总结起来就是一句:每次在上次能跳到的范围(end)内选择一个能跳的最远的位置(也就是能跳到maxPos位置的点)作为下次的起跳点 !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class Solution { public: int jump(vector<int>& nums) { int maxPos = 0, n = nums.size(), end = 0, step = 0; for(int i = 0; i < n - 1; ++i) { if(maxPos >= i) { maxPos = max(maxPos, i + nums[i]); if(i == end) { end = maxPos; ++step; } } } return step; } };
最后
以上就是慈祥洋葱最近收集整理的关于45. 跳跃游戏 II45. 跳跃游戏 II的全部内容,更多相关45.内容请搜索靠谱客的其他文章。
发表评论 取消回复