Frog Jump

来源:互联网 发布:linux退出help命令 编辑:程序博客网 时间:2024/06/12 18:50

这道题充分的展示了dfs暴力搜索和动态规划的关联和区别。

对于dfs来说,进入下一次迭代是有判断条件的,这个判断条件和动态规划中的递推公式起的作用非常相似,都是推动算法向下一步进行。但是dfs的时间复杂度是O(C^n),其中C是常数。相比之下,动态规划的时间复杂度是O(n^2)。虽然动态规划中的一些查找操作也会耗费掉一些时间,但是通过使用合适的数据结构可以缩短这部分时间,改进之后的dp算法可以AC。

先上dfs的代码,做了最多的剪枝还是TLE:

class Solution {public:bool flag = false;bool help(vector<int>& stones, int start, int step) {if (flag) return true;if (start == stones.size() - 1){flag = true;return true;}for (int i = start + 1; i < stones.size(); i++) {if (stones[i] - stones[start] < step - 1) continue;if (stones[i] - stones[start] > step + 1) return false;if (help(stones, i, stones[i] - stones[start])) return true;}return false;}bool canCross(vector<int>& stones) {return help(stones, 0, 0);}};

然后是剪枝加优化搜索的dp:

class Solution {public:bool canCross(vector<int>& stones) {unordered_map<int, set<int>> map;vector<int> maxMap(stones.size()); map[0] = set<int>{0};int nmax = 0;for (int i = 1; i < stones.size(); i++) {set<int> set ;for (int j = i - 1; j >= 0; j--){int step = stones[i] - stones[j];if (step > maxMap[j] + 1) //剪枝break;if (map[j].count(step - 1)>0 || map[j].count(step)>0 || map[j].count(step + 1)>0)//map是哈希表,查找map[j]的时间复杂度是O(1),count函数时间复杂度为log(n){set.insert(step);nmax = max(nmax, step);}}map[i]=set;maxMap[i] = nmax;}return map[stones.size() - 1].size() > 0;}};


0 0
原创粉丝点击