![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
搜索
包括leetcode中复杂点的搜索
重you小垃
这个作者很懒,什么都没留下…
展开
-
dfs bfs模板
1:二维bfs 2:二维dfs原创 2022-06-07 22:41:06 · 189 阅读 · 0 评论 -
leetcode1020. 飞地的数量(中等)
思路:dfs/bfs模板题跟 leetcode130.被围绕的区域(中等) 类似https://blog.csdn.net/zhangjiaji111/article/details/123668205原创 2022-07-02 11:38:12 · 150 阅读 · 0 评论 -
leetcode841. 钥匙和房间(中等)
搜索的模板题思路一:dfs思路二:bfs原创 2022-07-02 11:17:10 · 119 阅读 · 0 评论 -
leetcode686.重复叠加字符串匹配(中等)
思路:2是个很关键的数字,可以表示有后一半开头的情况。直接上代码吧:class Solution {public: int repeatedStringMatch(string a, string b) { int len1 = a.size(), len2 = b.size(); string str1 = a, str2 = a + a, str3 = a + a + a; int ans = 0; if (len2 ...原创 2021-12-22 22:40:53 · 554 阅读 · 0 评论 -
leetcode46.全排列(中等)
思路1:用n!次next_permutation()next_permutation()的复杂度是O(n),所以应该不会越界,当到了排列最大值时返回false;class Solution {public: bool next(vector<int>& nums); vector<vector<int>> permute(vector<int>& nums) { vector<vector<..原创 2021-10-06 22:27:12 · 57 阅读 · 0 评论 -
leetcode797. 所有可能的路径(中等)
思路:无环 -> dfs找路径,直到到达n - 1注意:记忆化dfs(保存某节点到n-1的路径)并不会优化,这是因为构造ans的复杂度和直接dfs的复杂度是一样的,并不会真正优化 ->自己尝试写过代码了, 用了记忆化甚至更慢了。。。...原创 2022-06-11 20:05:56 · 132 阅读 · 0 评论 -
leetcode417. 太平洋大西洋水流问题(中等)
思路:二维坐标dfs思路细节:如果元素搜索的话,复杂会很高,倒着来思考,即水往高处流。从左边和从上边作为起点搜索,往==或者>的位置搜索,能到达的位置就是能流到太平洋的方格,大西洋同理,都能到达的方格即为ans。易错点:搜索的起始位置,也可能是ans,要在调用dfs之前进行特殊考虑。...原创 2022-06-11 12:58:43 · 128 阅读 · 0 评论 -
leetcode785. 判断二分图(中等)
题意转换->将所有节点分成两组,每条边两个结点分别来自两组。思路:dfs染色(两种)。 每条边两个结点染不同的颜色(1 / -1),若两端结点颜色一致 则 return false注意:可能不是连通图->多次dfs......原创 2022-06-11 11:47:43 · 71 阅读 · 0 评论 -
leetcode463. 岛屿的周长(简单)
法一:遍历每个方格,判断四周的位置,如果是边界外或者是水域则ans++法二优化:由于只有一个岛屿,所以可以优化到只遍历它周围的格子原创 2022-06-11 11:15:07 · 92 阅读 · 0 评论 -
leetcode695. 岛屿的最大面积(中等)
模板题。。思路一:dfs思路二:bfs原创 2022-06-09 12:22:16 · 59 阅读 · 0 评论 -
leetcode200.岛屿数量(中等)
思路1: DFS,也就是求含1块的个数,略思路2: BFS,同理,略思路3: 并查集:把每个块都弄成一个集合。难点1.二维表(n*m),元素对应到一维下标是i *n+j,也就是0…n-1 n…2. 集合的块数求法1:最后枚举father[i]==i的个数3. 集合的块数求法2:先统计出’1’的个数sum,每fau!=fav合并一次sum-- 一次,最后返回sum即可注意:只需要和左边(‘1’)上边(‘1’)的元素合并即可,这样就把把左边集合和上面的集合合并了起来class Solut...原创 2021-05-15 17:57:37 · 146 阅读 · 0 评论 -
6059. 检查是否有合法括号字符串路径(周赛,困难,记忆化)
思路:记忆化dfs知识点1:n * m的矩阵,向下需要走n-1次,向右需要走m-1次,加上[0][0]的位置,所以[0][0]到[n-1][m-1]经过的方格数为m-1+n(m-1+n-1+1)个知识点2:遇到左括号加1,遇到右括号-1,由于左括号最多的个数为:(m-1+n)/2,所以在每个位置的状态为:0 ->(m-1+n)/ 2时间复杂度分析:总共的状态数为:m * n * (m-1+n)/ 2,所以时间复杂度在O(10^6)class Solution {public: ...原创 2022-05-08 22:17:07 · 168 阅读 · 0 评论 -
leetcode279.完全平方数(中等)
方法一:看到最少->想到bfs。class Solution {public: int numSquares(int n) { queue<int> q; unordered_set<int> ust; for (int i = 1; i * i <= 10000; ++i) { ust.insert(i * i); } q.push(..原创 2021-12-16 13:08:00 · 134 阅读 · 0 评论 -
剑指offer13.机器人的运动范围(中等)
一开始的误解:以为满足数位之和<=k的地方都能到,实际上有可能是到不了的,因为不是x+y而是x的每一位和y的每一位相加!!!思路(就是二维数组中地图中相邻1的个数,套模板即可,模板记不清了)1:BFS int xy[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};bool flag[m][n];queue<pair<int, int>> q;q.push(make_pair(0, 0));flag[0][0] = true;while .原创 2021-10-11 20:21:44 · 94 阅读 · 0 评论 -
LCD07.传递信息(简单)
题意分析:本质是求有向图中第k层有多少个n-1.解法一:dfs时间复杂度:O(n^k),即最多每个结点均指向n-1个结点具体细节:当到第k层时return ;class Solution {public: vector<vector<int>> graph; int ans = 0; void dfs(int n, int index, int k, int layer) { if (layer == k) { ..原创 2022-04-17 12:06:02 · 137 阅读 · 0 评论 -
leetcode397.整数替换(中等)
思路一:dfs (时间复杂度:O(logn),即n二进制中1的个数)奇数有两个分支,对于偶数只有两个分支。class Solution {public: unordered_map<int, int> umap; int integerReplacement(int n) { if (n == 1) return 0; if (umap.count(n)) return umap[n]; if (n % 2) { ..原创 2022-04-16 12:05:14 · 644 阅读 · 0 评论 -
leetcode130.被围绕的区域(中等)
思路:从边缘开始遍历,遍历到的‘O’做个标记,是不需要被修改的。其他的’O’是可以被修改的。思路一:bfsclass Solution {public: void bfs(const vector<vector<char>>& board, vector<vector<int>> &flag, int x, int y) { int m = board.size(), n = board[0].si...原创 2022-03-22 18:50:12 · 384 阅读 · 0 评论 -
leetcode17.电话号码的自然组合(中等)
class Solution {public: vector<string> result; string str[10] ={"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; //字符串数组的定义!!! string temp; void dfs(int i, int len, string digits); vector<string> letterCo.原创 2020-12-10 13:56:19 · 112 阅读 · 0 评论 -
leetcode127.单词接龙(困难)
方法:看到最短->bfs难点:建图。1:一个单词找邻居常规做法:wordList.size()word.size() 也就是5000 * 10 所有单词再 5000肯定会超时2:如果按照单词中的每个位置进行枚举26次,然后看在wordList中是否存在:26word.size() 也就是2610 所有单词乘以5000,复杂度大大缩小,建图复杂度减小。class Solution {public: int ladderLength(string beginWord, strin..原创 2022-03-03 22:29:43 · 116 阅读 · 0 评论 -
leetcode78 子集(中等)
子序列------>dfs子字符串,连续子数组----->滑动窗口class Solution {public: vector<vector<int>> result; vector<int> temp; void dfs(int index, vector<int> temp, vector<int> nums); vector<vector<int>> subsets(.原创 2020-12-02 00:07:31 · 75 阅读 · 0 评论 -
leetcode301.删除无效的括号(困难)
自己的思路:用2进制模拟dfs,然而这样的复杂度是2^n * n,会超时。。。解法一:对上面的dfs做优化。具体思路:先分别计算出左括号和右括号需要删除的个数。然后用dfs,参数中记录剩下需要删除的个数,如果个数大于0才删除。class Solution {public: vector<string> ans; void dfs(string s, int index, int left, int right) { if (s.size() - in...原创 2021-12-24 17:10:44 · 430 阅读 · 0 评论 -
leetcode22.括号生成(中等)
思路:由于16小于30,所以直接dfs没问题class Solution {public: vector<string> ans; int judge(string& tmp) { int sum = 0; for (auto& each : tmp) { sum = (each == '(') ? sum + 1 : sum - 1; if (sum < 0) retu..原创 2021-12-13 22:28:11 · 272 阅读 · 0 评论 -
leetcode39.组合总和(中等)
思路:类似多背包问题难点:不熟悉模板if (满足条件) { 更新ans; return ;}if (index == n - 1 || 不满足条件) return ;ans.push_back(a[m]);dfs(m); ans.pop_back();dfs(m+1);易错点:dfs(index + 1, sum + candidates[index + 1], ans, each, candidates, target); 第二个参数写错了,不选index的一个了,所以应该...原创 2021-10-06 21:43:14 · 59 阅读 · 0 评论 -
leetcode79.单词搜索(中等)
思路:DFS+剪枝处理技巧: 只要一个分支满足即return,定义一个flag变量进行剪枝。易错点:1:在搜索之前,应该先把起点的visit值置为true!!!2:DFS的终止条件不能判断匹配的字符是否到最后一个字符的后一个位置,因为递归可能会到不了这里(当匹配到最后一个字符时,周围都是匹配过的或者是矩阵的外面)class Solution {public: int visited[6][6]; int xy[4][2] = {0, 1, 0, -1, 1, 0, .....原创 2021-10-26 22:07:00 · 84 阅读 · 0 评论 -
leetcode1559.二维网格图中探测环(判断存在环,中等)
判断图中是否存在环有两种方法:1.并查集,对每条边进行遍历,并将边两边的节点进行合并,如果遍历到一条边,两个端点的findfather相等,则出现了环。2.DFS。需要注意的是,在下一层搜索的时候,不能往相反的方向搜索!!方法一:并查集class Solution {public: vector<int> father; int findfather (int u); bool containsCycle(vector<vector<char....原创 2021-11-16 21:35:27 · 704 阅读 · 0 评论