leetcode45
我的方法:动态规划
一开始是想用二维数组dp[i][j],表示从i到j的最少跳数。但是这样的话时间复杂度是O(n^3),超时了。
后来经过chatgpt的提醒,改为用一维数组dp[i],表示从index=0到index=i所需的最小跳数。最后返回dp[n-1]。
代码如下:
class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
int *dp = (int *)malloc(10000*sizeof(int));
for(int i=0;i<n;i++){
dp[i]=1e9;
}
dp[0]=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n&&j<=i+nums[i];j++){
dp[j] = min(dp[j], dp[i]+1);
}
}
return dp[n-1];
}
};
时间复杂度为O(n^2).
一个更加clean和fast的方法:
class Solution {
public:
int jump(vector<int>& nums) {
for(int i = 1; i < nums.size(); i++)
{
nums[i] = max(nums[i] + i, nums[i-1]);
}
int ind = 0;
int ans = 0;
while(ind < nums.size() - 1)
{
ans++;
ind = nums[ind];
}
return ans;
}
};
for循环得到每个点所能达到的最远点,这个最远点可能不是从这个点出发跳到的(可能是由这个点之前的点出发跳到的)。
while循环类似于贪心,每一次都选跳到的最远的点,直到跳到末尾为止。
这个方法非常巧妙。