1. 思路A
被以前做过的一个类似题目限制了思路,用dp,因为是稳定O(n^2)复杂度,所以超时了。
改为BFS,也超时了。想了下,BFS可以优化,每个点其实枚举下个可以到达的点,步长不一定是从0开始,因为答案是单调的,也就是说如果到达n需要k步,那么到达比n小的地方需要的步数一定小于等于k。所以可以维护一个已经扩展的最大的值。
时间复杂度O(n),空间复杂度O(n)
2.代码A
class Solution {
struct node
{
int val, pos;
};
public:
int jump(vector<int>& nums) {
int n = nums.size();
queue<node> que;
que.push({0, 0});
int right = 0;
while(!que.empty())
{
node cur = que.front();
que.pop();
if(cur.val == n - 1) return cur.pos;
for(int i = max(cur.val, right) + 1; i - cur.val <= nums[cur.val] && i < n; ++i)
{
que.push({ i, cur.pos + 1});
}
right = cur.val + nums[cur.val];
}
return 0;
}
};
3. 思路B
其实这个题目可以直接用贪心做,保证每一步都能找能走到最远的即可。这样只需要遍历一遍即可得到结果。时间复杂度O(n),空间复杂度O(1)
4.代码B
class Solution {
public:
int jump(vector<int>& nums) {
int end = 0;
int maxPosition = 0;
int steps = 0;
for(int i = 0; i < nums.size() - 1; i++){
//找能跳的最远的
maxPosition = max(maxPosition, nums[i] + i);
if( i == end){ //遇到边界,就更新边界,并且步数加一
end = maxPosition;
steps++;
}
}
return steps;
}
};