leetcode 45 跳跃游戏II
方法一:动态规划 O(n^2)
int jump(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n,n); // 达到i需要的步数dp[i]
dp[0] = 0;
for(int i = 0; i<n; i++)
{
for(int k = 0; k<i;k++)
{
if(k + nums[k] >= i)
{
dp[i] = min(dp[i],dp[k]+1);
}
}
}
return dp[n-1];
}
方法二:
贪心算法:O(n)
其中i+nums[i] 是以第i位为基础,可到达的最远距离。
step 为需要的步数
cur 是当前布可以达到的最远距离
next 是下一步可以达到的最远距离。
int jump(vector<int>& nums) {
int n = nums.size();
if(n <= 1)
return 0;
int step = 0;
int cur = 0;
int next = nums[0];
for(int i = 1; i < n; i++)
{
if(i>cur)
{
step += 1;
cur = next;
}
next = max(next,i+nums[i]);
}
return step;
}