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
- Frog Jump
- Frog Jump
- frog jump
- Frog Jump
- Frog Jump
- Frog Jump
- Frog Jump
- Frog Jump
- LeetCode #403: Frog Jump
- [leetcode]403. Frog Jump
- [Leetcode] Frog Jump
- leetcode 403.Frog Jump
- 403. Frog Jump
- 【LeetCode】403. Frog Jump
- Leetcode (403) Frog Jump
- LeetCode403. Frog Jump
- 403. Frog Jump
- [leetcode] 403. Frog Jump
- 范围判断标签
- Linux系统下安装jdk
- ionic ng-bind-html
- 工作流模式每个工作流引擎都会支持多种方式的表单。目前大家讨论到的大概有三种。 动态表单 外置表单 普通表单
- Oracle PL-SQL的一些概念
- Frog Jump
- Android 编程下实现 Activity 的透明效果
- RxJava学习笔记
- MFC 中CFileDialog的用法
- java 诡异的代码
- 复合电源管理平台结构
- Static关键字深入理解
- Spring学习1-概述
- 使用Toolbar + DrawerLayout快速实现单侧滑