
搜索
cx_cs
这个作者很懒,什么都没留下…
展开
-
126. 单词接龙 II
无原创 2023-03-09 13:29:28 · 238 阅读 · 0 评论 -
52. N皇后 II
无原创 2022-08-18 17:12:24 · 71 阅读 · 0 评论 -
329. 矩阵中的最长递增路径
要求:rt思路:dfs,求每个单元格出发的最大递增路径,四个方向要大的才继续搜,要记忆化一下,如果不为0说明计算过了class Solution {public: int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int rows, columns; int longestIncreasingPath(vector< vector<int> > &matrix) { if (原创 2022-04-18 10:04:21 · 221 阅读 · 0 评论 -
212. 单词搜索 II
要求:在矩阵相邻找字典里单词思路:法一:暴力,从矩阵每个点开始向四个方向找,字典单词先哈希表存起来。O(mn4^10)class Solution {private: unordered_set<string> us; vector<vector<char>> board; vector<pair<int, int>> direction; int rows; int cols; bool v原创 2022-04-11 14:10:25 · 117 阅读 · 0 评论 -
140. 单词拆分 II
要求:rt思路:之前有一个背包问题判断能否拆,这题要所有结果,要记忆化搜索,记录从下标开始的所有串,不然超时class Solution {private: unordered_map<int, vector<string>> ans; unordered_set<string> wordSet;public: vector<string> wordBreak(string s, vector<string>&am原创 2022-04-05 12:41:09 · 139 阅读 · 0 评论 -
301. 删除无效的括号
要求:删除最少括号,返回所有可能结果思路:显然要暴力回溯。首先确定最少删几个左右括号,然后遍历每个字符尝试删除即可。注意的是这里删除是跳过不选,也就是说实际上我们做的只是选取字符而非删除,选取右括号时必须左括号数大于才行。最后set去重。class Solution {public: unordered_set<string> unique; vector<string> removeInvalidParentheses(string s) {原创 2022-03-22 19:48:37 · 145 阅读 · 0 评论 -
51. N 皇后
要求:不在横竖斜线思路:回溯class Solution {public: vector<vector<string>> v; vector<vector<int>> q; bool inrow(int i,vector<string> &board){ for(int k=0;k<board.size();++k) if(board[i][k]=='Q')retu原创 2021-10-21 10:55:26 · 60 阅读 · 0 评论 -
37. 解数独
class Solution {public: vector<vector<int,int>> dot; void dot(vector<vector<char>>& board){ for(int i=0;i<9;++i) for(int j=0;j<9;++j) if(board[i][j]=='.') do原创 2021-10-20 22:28:02 · 96 阅读 · 0 评论 -
131. 分割回文串
要求:如题思路:回溯,可以记录f[i][j]是否回文来加速,也可以先动归记录好class Solution {public: vector<vector<string>> v; vector<string> tmp; bool judge(string &s){ string t=s; reverse(s.begin(),s.end()); return s+t==t+s; }原创 2021-10-20 21:01:36 · 54 阅读 · 0 评论 -
90. 子集 II
要求:有重复元素但子集不能一样思路:法一:回溯,去重常见操作:start、lastnum、sortclass Solution {public: vector<vector<int>> v; vector<int> tmp; void dfs(int start,vector<int> &nums){ v.push_back(tmp); if(tmp.size()==nums.size()原创 2021-10-20 20:32:26 · 84 阅读 · 0 评论 -
78. 子集
要求:幂集思路:法一:可以对每个长度循环回溯,但是没必要循环,只要中间所有vector都放进来即可class Solution {public: vector<vector<int>> v; vector<int> tmp; void dfs(vector<int>& nums,int start){ v.push_back(tmp); if(tmp.size()==nums.size()原创 2021-10-20 19:39:47 · 71 阅读 · 0 评论 -
216. 组合总和 III
要求:1到9,不重复,k个数,组成n思路:回溯,套路题不说了,时间100%,空间88%class Solution {public: vector<vector<int>> v; vector<int> tmp; void dfs(int &k,int &n,int sum,int start){ if(tmp.size()==k){ if(sum==n)v.push_back(tmp)原创 2021-10-19 12:28:15 · 69 阅读 · 0 评论 -
40. 组合总和 II
要求:跟39题区别是每个数只能用一次并且数组本身有重复思路:回溯,先排序,用lastnum保证每轮的数不重复,用count代替visit保证重复的数都能访问到,用start保证从小到大,剪枝在注释,超过57%,,47%class Solution {public: vector<vector<int>> v; vector<int> tmp; unordered_map<int,int> count; void dfs(v原创 2021-10-19 12:15:36 · 93 阅读 · 0 评论 -
39. 组合总和
要求:和为target的组合,可以重复用数组中的数思路:回溯,注意下次找的数大于等于这次的,剪枝在注释部分,时间超过68%,空间85%class Solution {public: vector<vector<int>> v; vector<int> tmp; void dfs(vector<int>& candidates,int &target,int sum,int start){ if(su原创 2021-10-19 11:57:48 · 66 阅读 · 0 评论 -
77. 组合
要求:从1到n的长度为k的组合思路:回溯,注意[1,2]和[2,1]重复,所以下次递归要从比上次大的数开始,dfs第一句剩下的数不够填满时剪枝,是时间击败99%关键class Solution {public: vector<vector<int>> v; vector<int> tmp; unordered_map<int,int> visited; void dfs(int &k,int &n,int原创 2021-10-19 11:40:11 · 89 阅读 · 0 评论 -
47. 全排列 II
要求:会有重复数字的数组全排列,去重思路:每轮不加同样的数就行了,lastnum记录,提前排序。可以用一个count代替visited表示数组中每个数有多少个,放一个个数减一,也可以用visited记录位置i是否被访问而非nums[i],用count思路清晰点class Solution {public: vector<vector<int>> v; unordered_map<int,int> count; vector<int>原创 2021-10-19 11:20:20 · 105 阅读 · 0 评论 -
46. 全排列
要求:如题思路:回溯class Solution {public: unordered_map<int,int> visited; vector<vector<int>> v; vector<int> tmp; void dfs(vector<int>& nums){ if(tmp.size()==nums.size()){ v.push_back(tmp);原创 2021-10-19 10:42:55 · 80 阅读 · 0 评论 -
257. 二叉树的所有路径
要求:如题思路:回溯dfs,bfs也可以,dfs写法上业可以改为一进来非空则加路径,注意这种二叉树遍历型题目不需要visited/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} *原创 2021-10-19 09:54:18 · 98 阅读 · 0 评论 -
79. 单词搜索
要求:在矩阵找单词,只能横竖且不能重复思路:回溯dfs,注意普通dfs只是遍历一遍就完事,但是这个需要回溯,即visited回溯时需要重写为0,搜索题很多时候都可以修改原数组节省visited比如本题访问时可以先改成#再改回来class Solution {public: void dfs(int i,int j,int index,vector<vector<char>>& board,string &word,bool &ex,map<原创 2021-10-18 12:22:13 · 67 阅读 · 0 评论 -
93. 复原 IP 地址
要求:给一串数字组合ip地址思路:回溯,这题判断条件太多了吐了ip前三个要注意的条件:1、不能超过总长度给第四个留位置2、首位为0只能加一位,不为0要小于等于255ip第四个要注意的条件:1、剩下一位可以2、剩下小于等于3位且首位不为0且小于等于255class Solution {public: void getAll(vector<string> &v,int index,string tmp,string &s,int depth){原创 2021-10-18 11:21:50 · 78 阅读 · 0 评论 -
17. 电话号码的字母组合
要求:九键输入能打多少组合思路:回溯:用到dfs,跟分治的区别在于额,一个是优化版的穷举遍历,一个是先分后和,差不多吧,都可以解决排列组合问题,不必纠结,灵活运用class Solution {public: string s[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; void lettercom(string &digits,int index,vector<string> &v,str原创 2021-10-18 10:20:36 · 65 阅读 · 0 评论 -
417. 太平洋大西洋水流问题
要求:水往低处流向两边,找同时能留到左边或者上边、右边或者下边的思路:法一:对每个点暴力dfs,640ms勉强过了hhclass Solution {public: void dfs(vector<vector<int>>& heights,int i,int j,bool &topa,bool &toat,map<pair<int,int>,int> &visited){ if(i==0||j=原创 2021-10-13 14:40:54 · 74 阅读 · 0 评论 -
130. 被围绕的区域
要求:把被围起来的o改成x但是o在边界的话全都不能改思路:dfs,当然bfs和并查集也行,用了个数组存了改过的元素发现有o在边界的全部改回来,一遍过了class Solution {public: void dfs(vector<vector<char>>& board,vector<pair<int,int>> &o,int i,int j,bool &addright){ if(i<0||i>原创 2021-10-13 12:48:25 · 76 阅读 · 0 评论 -
547. 省份数量
要求:给连通矩阵求连通分支数思路:法一:这种是真的图,每一行都表示一个节点情况,跟一般的矩阵不一样(如求岛屿数量这种无脑遍历),直接对每个节点dfs,当然还可以bfsclass Solution {public: void dfs(vector<vector<int>>& isConnected,int i){ isConnected[i][i]=0; for(int j=0;j<isConnected.size();++原创 2021-10-13 12:20:44 · 55 阅读 · 0 评论 -
200. 岛屿数量
要求:找连起来的’1’思路:dfs,有个坑是1不是数字而是字符class Solution {public: void dfs(int i,int j,vector<vector<char>>& grid){ if(i<0||i>=grid.size()||j<0||j>=grid[0].size()||grid[i][j]=='0')return; grid[i][j]='0'; int原创 2021-10-13 11:31:06 · 77 阅读 · 0 评论 -
695. 岛屿的最大面积
要求:找连起来的1思路:dfs,不开visit,直接用原数组记录。也可以用bfs或者dfs+栈class Solution {public: int dfs(vector<vector<int>>& grid,int x,int y,int &count,int m,int n){ if(grid[x][y]==1){ grid[x][y]=2; ++count; i原创 2021-10-13 10:33:01 · 66 阅读 · 0 评论 -
127. 单词接龙
要求:从begin转到end,转换只能用字典里单次包括end,相差一个字母可转,求转换序列长度思路:bfs,记录访问过的,题目要求长度其实相当于最短路径,相对简单的思路,还可以用双向bfs优化啥的class Solution {public: bool canconvert(string &s,string &t){ int n=s.size(); int diff=0; for(int i=0;i<n;++i)原创 2021-10-12 10:50:59 · 65 阅读 · 0 评论 -
279. 完全平方数
要求:找最少完全平方数使和为n思路:法一:最少可以理解为最短路径,节点n到节点0,中间相邻两个节点的差等于完全平方数,第一层是n,设(int)sqrt(n)=sn,则n的下一层是n-sn^2,n-(sn-1)平方,…n-1平方。同理第三层是第二层每个节点减去相应的平方但是如果每一层都放进所有元素会超时,要记录visited,因为元素相同记一个就行了,从那个开始下降class Solution {public: int numSquares(int n) { queue<原创 2021-10-12 10:18:20 · 81 阅读 · 0 评论 -
1091. 二进制矩阵中的最短路径
要求:从(0,0)走到(n-1,n-1)只能经过0,最短距离思路:bfs,每层都要用while遍历,visited可以不必要,访问过的改成1即可class Solution {public: int shortestPathBinaryMatrix(vector<vector<int>>& grid) { queue<pair<int,int>> q; map<pair<int,int>,原创 2021-10-12 09:37:57 · 110 阅读 · 0 评论