https://leetcode.com/problems/frog-jump/
想到需要使用set的时候,就准备放弃了,因为当时觉得用Set时间复杂度马上上去,,,然后被科普了,,unordered_set和unordered_map是O(1)的因为是hash实现的。
那么题目就没有难度了。
dp[i]存所有可以从i走的步长
遍历dp[j]更新dp[i]即可。
需要注意的一点,如下代码注释掉的地方,当发现过程中,有些点不可达的时候,不能认为重点不可达。因为有这样的情况,就是到达终点的时候,不需要经过其中某些点。
class Solution {
public:
bool canCross(vector<int>& stones) {
uint e = stones.size();
vector<unordered_set<uint>> dp(e);
dp[0].insert(1);
for (uint i = 1; i < e; i++) {
for (uint j = 0; j < i; j++) {
uint dis = stones[i] - stones[j];
if (dp[j].count(dis)) {
dp[i].insert(dis);
if (dis > 1) dp[i].insert(dis - 1);
if (dis < stones[e-1] - stones[i]) dp[i].insert(dis + 1);
}
}
}
return dp[e - 1].size();
}
};