LeetCode:45. Jump Game II

最近看到bfs就从终点开始考虑,这一题却是从开头考虑的:(
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() < 2)
return 0;
queue<int> q;
q.push(0);
int level = 0;
int sz = nums.size();
while (!q.empty()) {
++level;
int qsz = q.size();
int maxIdx = -1;
int maxNextIdx = -1;
while (qsz-- > 0) {
int idx = q.front();
q.pop();
if (idx + nums[idx] >= sz-1) {
return level;
}
maxIdx = max(maxIdx, idx);//不是每弹出一个queue里面的就把它范围内的压进去,那样会压进去很多重复的。算出最大范围是多少,一次性压
maxNextIdx = max(maxNextIdx, idx+nums[idx]);
}
for (int j = maxIdx+1; j <= maxNextIdx; ++j)
q.push(j);
}
return -1;
}
};
//bfs不仅要从终点考虑,也需要从起点考虑
下面是用贪心,应该是最优:
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() < 2)
return 0;
int curBeg = 0, curEnd = 0;
int maxReach = -1;
int level = 1;
for (int i = 0; i < nums.size(); ++i) {
if (i > curEnd) {
curBeg = i;
curEnd = maxReach;
++level;
}
maxReach = max(maxReach, nums[i] + i);
if (maxReach >= nums.size()-1)
return level;
}
return -1;
}
};
其实道理都差不多,不过观察到bfs里面每层迭代我们关心的其实是最远的那个,这里直接就暴露出来了。以后遇到类似的bfs可以想到贪心
浙公网安备 33010602011771号