题目链接:leetcode.
这道题是跳跃游戏的加强版
用双循环可以找到答案但时间复杂度是O(n^2)
/*
执行用时:348 ms, 在所有 C++ 提交中击败了13.45%的用户
内存消耗:16.6 MB, 在所有 C++ 提交中击败了5.24%的用户
*/
class Solution {
public:
int jump(vector<int>& nums) {
int N = nums.size();
vector<int> dp(N, INT_MAX);
dp[0] = 0;
for(int i = 0;i < N;++i)
{
for(int j = 1;j <= nums[i] && (i + j) < N;++j)
{
dp[i + j] = min(dp[i + j], dp[i] + 1);
if(i + j == N - 1)
return dp[i + j];
}
}
return dp[N - 1];
}
};
所以还是用贪心,可以将时间复杂度降到O(n)
每次跳跃的时候,考虑此次跳到哪里才能在下一次跳的更远,依此类推
/*
执行用时:12 ms, 在所有 C++ 提交中击败了70.04%的用户
内存消耗:15.8 MB, 在所有 C++ 提交中击败了79.67%的用户
*/
class Solution {
public:
int jump(vector<int>& nums) {
int N = nums.size();
int step = 0, end = 0, maxx = 0;
for(int i = 0;i < N;++i)
{
if(end >= N - 1)//最远的地方已经达到或超出最后一个位置啦
{
break;//防止还没跳就已经到达终点的情况
}
maxx = max(maxx, i + nums[i]);//本次跳跃能跳到的最远的地方
if(i == end)//已经跳到了上次最远的地方
{
end = maxx;//下次能跳到最远的地方就是本次的maxx值
step++;//跳!
}
}
return step;
}
};
一道关于跳跃游戏的LeetCode题目,原问题使用双循环解决,时间复杂度较高。通过贪心算法优化,可将时间复杂度降低到线性,实现更高效的解题策略。
512

被折叠的 条评论
为什么被折叠?



