[LeetCode] 45. Jump Game II
一、问题描述
二、问题分析
这道题虽说是55题的升级版,问法也差不多,但在解题思路上却跟上题很大的不同。55题是问能否到达最后一个元素位置,而45题问的是最少多少步能到达最后的位置(前提是已经确定能够到达)。本题所有的算法就是贪心算法,每次访问一个位置,看看它能到达的最远位置之内的其他位置所能到达的最远位置是多少。每次偶读贪心的选择最远的位置,这样能保证总步数最小。主要原因是这个数组是二维的,因此每次选最远即可。因此这个问题有两个循环。外循环看看此位置可达的最远位置是多少,内循环在此位置与标记的最远位置之间进行遍历,而每个内循环也被我称作一层。
三、问题求解
针对问题分析,以下是c++源代码:
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() == 1) return 0;
int steps = 0;
int maxStep = 0;
int currentSetp = 0;
int n = nums.size();
while (currentSetp < n) {
steps++;
int tempStep = currentSetp + nums[currentSetp];
if (tempStep > maxStep) maxStep = tempStep;
if (maxStep >= n - 1) {
return steps;
}
currentSetp++;
int layer = maxStep;
while (currentSetp < layer) {
int tempStep2 = currentSetp + nums[currentSetp];
if (tempStep2 > maxStep) maxStep = tempStep2;
if (maxStep >= n - 1) {
return ++steps;
}
currentSetp++;
}
}
}
};