![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dfs
Noric!
这个作者很懒,什么都没留下…
展开
-
LeetCode399 除法求值(floyd)
Floyd-Warshall算法:O(∣V∣3)O(|V|^3)O(∣V∣3) 内计算任意两点的最短路。(dp的思想)计算点 i 到 j 的最短路,考虑最短路是否会经过点 k 。有两种情况:经过点 k :d[i][j] = d[i][k] + d[k][j]不经过 k :d[i][j]则最短路的状态转移方程:d[i][j] = min(d[i][j], d[i][k] + d[k][j])附上代码:存图(邻接表) + dfs(查询)typedef pair<int,double&g.原创 2021-11-25 14:53:38 · 585 阅读 · 0 评论 -
Leetcode207 课程表 I+II(dfs+bfs)
使用dfs的思想,对每个课程进行搜索。learn[class]中存储当前课程的状态,共有三种可能:learn[class] = -1【未搜索】首次遇到class,对其进行递归搜索learn[class] = 0【搜索中】前序搜索过此class但还未回溯,说明遇到环,无法完成学习learn[class] = 1【已完成】此class已被成功学习,无需操作当某课程的所有前序课程,均为“已完成”状态时,将其标记为已完成。附上代码:class Solution {public: voi.原创 2021-11-13 22:09:01 · 430 阅读 · 0 评论 -
LeetCode 47 全排列II(有重复元素 dfs)
对于有重复数字的全排列,分析重复情况的主要来源:相同的位置选择了不同但数值相同的数字。对于重复的数字,人为控制放入相同数字的数量(枚举从1~N),只要保证选择i个连续相同数字后,紧跟的数字不相同(不能构成连续的i+1个相同数字)即可保证排列唯一性。tricks:用map存储每个数字的个数。枚举for循环结束后,统一pop出N个相同数字维护当前排列。附上代码:class Solution { map<int,int> vis;public: void dfs(vecto.原创 2021-11-12 22:26:19 · 566 阅读 · 0 评论 -
LeetCode46 全排列(dfs)
全排列的思想:每个位置上都有n种选择,已经被选择过的不能够再次选中。所有的可能:n! 种。使用递归dfs,用 map 记录已经选择过的值,递归中使用for循环找到每一种可能性。附上代码:class Solution { map<int,int> vis;public: void dfs(vector<int>& nums, vector<vector<int>>& out, vector<int>&.原创 2021-11-12 20:59:05 · 402 阅读 · 0 评论 -
LeetCode 40 组合总和 II
这个题目中,有了新的限制每个数字在组合中只能使用一次,但是数组中的数字是可以重复的。在示例一中 [1,2,5] ~ [2,1,5] 均为可行的组合,然而这两个组合却是重复的。本题不能像组合总和那样仅依据是否选择某数字进行递归,而是要在是否选择的基础上,根据重复元素在组合中出现的次数来进行递归。首先,可以对输入的数组进行排序,这样既能将重复的数字聚集到一起,从小到大也利于树的剪枝。在freq中统计不同数字出现的次数,递归时保证不同次数的同一数值仅出现一次。需要注意递归时,target的传值和cur.原创 2021-10-11 14:52:40 · 85 阅读 · 0 评论 -
LeetCode 39 组合总和
题目中保证唯一组合小于150个,可以使用dfs暴力求解。dfs的附上代码:原创 2021-10-11 14:21:02 · 155 阅读 · 0 评论 -
LeetCode LCP45 自行车炫技赛场
从起点开始,对能达到的位置进行dfs。当速度为0或负值时,递归应停止。同一个位置可能会经过多次,用map记录每次到达该地的速度。若重复则停止避免死循环。typedef pair<int,int> P;class Solution { struct comp{ bool operator()(P p1, P p2) { if(p1.first == p2.first) return p1.second > p2.second; .原创 2021-10-10 14:49:58 · 140 阅读 · 0 评论 -
LeetCode 200 岛屿数量 dfs
这个题是经典的dfs遍历,其中用到的小tricks是:在原数组中,把dfs找到的陆地变成0,最后统计出原图中的‘1’的个数作为岛屿的数量。即简洁,又减少了重复计算的可能。附上代码:typedef pair<int, int> P;class Solution {vector<P> D{P(0,-1), P(0,1), P(-1,0), P(1, 0)};public: void dfs(vector<vector<char>>&.原创 2021-10-10 14:40:15 · 62 阅读 · 0 评论