思路:
想到用队列,一层一层往外扩。
相当于暴力了,还是过了,因为稍微剪了一点枝。
代码:
cpp
class Solution {
public:
int jump(vector<int>& nums) {
int n=nums.size();
queue<int> q;//<下标>
unordered_map<int,int> m;//键值对:键:下标 值:最小次数
q.push(0);
m[0]=0;
while(!q.empty())
{
auto t=q.front();
q.pop();
int zuiyuanjuli=t+nums[t];
for (int i = t + 1; i <= zuiyuanjuli && i < n; i++)
{
// 如果没有访问过或者找到了更少的跳跃次数
if (m.find(i) == m.end() || m[t] + 1 < m[i])
{
m[i] = m[t] + 1;
q.push(i); // 将新位置加入队列
// 如果已经到达终点
if (i == n - 1)
{
return m[i];
}
}
}
}
return m[n-1];
}
};
动态规划:
dp[i]:表示到达i所需的最短次数。
cpp
const int N = 1e4+10;
int dp[N];
class Solution {
public:
int jump(vector<int>& nums) {
memset(dp,0x3f,sizeof dp);
dp[0]=0;
for(int i=0;i<nums.size();i++)
{
int step=nums[i];
for(int j=i+1;j<=i+step&&j<nums.size();j++)
{
dp[j]=min(dp[j],dp[i]+1);
}
}
return dp[nums.size()-1];
}
};
贪心:
觉得代码不咋好理解,好难啊。。。