Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
Example:
Input: [2,3,1,1,4] Output: 2 Explanation: The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index.
Note:
You can assume that you can always reach the last index.
分析
这道题目是hard难度,但其实需要的代码量并不大,但是比较难以想出时间复杂度较低的解法。
初看到这一题,比较简单直观的一种解法是,记录一个与nums等长的数组jump,jump[i]代表到达第i为所需的最小的步数。
我们使用 i 遍历nums数组,每次遍历都要更新jump数组中[i, nums[i] + 1]的最小步数。但是此种解法超时。
思考怎么节约时间复杂度?
对于第 i 步所能到达的最大范围,我们只需要遍历 i-1 步达到的地址范围 [start, end],假设使用index遍历,我们只需要找出nums[index] + index的最大值。
Code
class Solution {
public:
int jump(vector<int>& nums) {
vector<int> jump;
int res = 0;
int length = nums.size();
if (length <= 1)
{
return res;
}
int step = 1;
int maxDis = nums[0];
int lastStart = 1;
while (true)
{
if (maxDis >= length -1)
return step;
int tmp = 0;
for (int i = lastStart; i <= maxDis; i ++)
{
if (nums[i] + i > tmp)
tmp = nums[i] + i;
}
lastStart = maxDis;
maxDis = tmp;
step ++;
}
return step;
}
};
运行效率
Runtime: 20 ms, faster than 38.37% of C++ online submissions for Jump Game II.
Memory Usage: 10.1 MB, less than 99.68% of C++ online submissions forJump Game II.