搜索
Lzed
我好菜啊
展开
-
Codeforces750D-New Year and Fireworks(bfs)
题目链接http://codeforces.com/contest/750/problem/D思路其实可以直接暴力的,虽然n有30那么大,状态可以达到2302^{30},但是每次生成的节点最多向左边扩展5个,因此,其实向左最大扩展150个,向右最多150个,所以格子最大300∗300300 * 300, 然后每个节点最多向8个方向扩展,并且对每个节点可以走的步数(tit_i)最大为5,于是总得状态为原创 2016-12-31 15:23:29 · 612 阅读 · 0 评论 -
Leetcode 606 - Construct String from Binary Tree (dfs)
题目链接https://leetcode.com/problems/construct-string-from-binary-tree/#/description题意给一个二叉树,要求用括号的形式表示出其前序遍历的结果。要取掉冗余的括号思路dfs 对于一个节点,有以下几种情况: 1. 空节点 2. 非空,无左右儿子:这时候我们将这个节点加入到结果直接返回即可 3. 非空,有左儿子,无右儿子:原创 2017-06-05 18:25:41 · 421 阅读 · 0 评论 -
Leetcode 93 - Restore IP Addresses(回溯法)
题意给一个由数组组成的字符串,要求把这个字符串还原成IP。 结果返回所有合法的IP地址。思路回溯法。 注意前导0的判断。代码class Solution {private: vector<string> ans;public: int Judge(string s) { if (s.length() > 1 && s[0] == '0') return -1;原创 2017-04-19 16:24:09 · 326 阅读 · 0 评论 -
386 - Lexicographical Numbers(dfs)
题意给出一个n,将前n个数字按照字典序排序后输出。思路dfs。从小到大循环一下当前位置应该放的数字即可。注意前导0。代码class Solution {private: vector<int> a; int n;public: void dfs(int x, int step) { if (x > n) return; if (x) a.p原创 2017-03-17 09:33:18 · 233 阅读 · 0 评论 -
排列组合问题及其实现
Permutation不含重复元素问题描述给一个大小为n为数组a,a内的元素互不相同,要求求出A(n,k)A(n, k)。思路直接dfs即可。枚举当前位需要放的数字,然后看前面是否出现。代码// a is original arrayvoid dfs(vector<int> t, int step) { if (step == k) { ans.push_back(t)原创 2017-04-03 13:52:35 · 333 阅读 · 0 评论 -
Leetcode 419 - Battleships in a Board(dfs)
题意给一个格点图,其中’X’代表当前位置有战舰,’.’代表当前位置为空位。其中,战舰只能横着放或者竖着放,并且长度为N(N为任意值)。并且,相邻两个战舰之间必须相隔一个格子。求:所以的战舰数目。思路算法1dfs,时间复杂度O(mn)O(mn),空间复杂度O(mn)O(mn)。其实就和求连通块一样(四个方向),因为题目保证了数据的合法性,所以我们直接dfs求连通块的数目就好。代码偷了个懒用set存的是原创 2017-03-14 12:01:39 · 254 阅读 · 0 评论 -
Leetcode 22 - Generate Parentheses(dfs)
题意给定一个n,求由n个左括号和n个右括号组成的合法括号序列。思路算法1直接暴力dfs,直接枚举当前位置为’(‘还是’)’,递归终点用栈判断结果是否合法。算法2在dfs的时候就保证结果的合法性。括号序列的基本格式就下面两种:相邻,()()相互嵌套,(())从上面的格式我们可以知道:对左括号没有要求,只要小于等于n即可。对右括号,任何时候右括号的数目就应该小于等于左括号的数目。从上面的条件原创 2017-03-23 14:30:45 · 233 阅读 · 0 评论 -
Leetcode - 47 - Permutations II(dfs)
题意给一个数组,数组内可能含有重复元素,求它的所有排列。思路首先,算法基于直接求数组的所有排列, 即Permutations。然后我们只需要考虑去重即可。去重的思路同Combination Sum II:先排序,然后dfs对于两个相同的数,如果它之前的那个数没有使用,那么它也不能使用。代码int vis[10000 + 5];class Solution {private: vec原创 2017-03-30 10:49:59 · 298 阅读 · 0 评论 -
Leetcode 51 - N-Queens(八皇后问题)
题意求N皇后问题的解思路回溯法,最后递归返回时还原路径即可。代码class Solution {private: int a[100]; int n; vector<vector<string>> ans;public: void dfs(int step) { if (step >= n) { vector<string>原创 2017-03-22 15:00:52 · 444 阅读 · 1 评论 -
Leetcode 337 - House Robber III(dfs)
最近实验多成狗完全没时间刷题啊= =题意给定一个二叉树,每个节点上有value,要求从二叉树上选一些点,是这些点的和加起来最大。并且有要求:如果一个节点选择了,那么其父节点和子节点都不能被选择。思路算法1暴力dfs,记录当前访问的节点及其父节点的访问状态:dfs(TreeNode *root, int s)s=1s = 1:父节点被访问了,那么该节点不能被访问。只能转移到dfs(root->left原创 2017-03-22 11:06:24 · 221 阅读 · 0 评论 -
Leetcode 77 - Combination(回溯)
题意求C(n,k)C(n, k)思路算法1二进制枚举状态。回溯法为了避免重复,当第i位为m时,i + 1后的位都在[m + 1, n]之间取。比如n = 4, k = 2。先枚举第一位为1,然后之后的1位数在[2, 4]之间取。当第一位为2,之后的1位数在[3, 4]之间取…。代码algorithm 1class Solution {public: vector<vector<int>>原创 2017-03-10 10:37:18 · 252 阅读 · 0 评论 -
Leetcode 39 - Combination Sum I, II, III(dfs)
题意给一个set C,然后还有一个你要凑出来的数target,要求C里面的数可以使用任意多次,求方案(输出具体方案)。思路先将数组从大到小排序(cut),然后开始搜索。 注意dfs模型:void dfs(int pos, vector<int> tmp, int sum) { if (Boundary) { //ok, time to judge retur原创 2017-01-24 17:29:59 · 424 阅读 · 0 评论 -
Leetcode 329 - Longest Increasing Path in a Matrix(dfs or dp)
题意给定一个矩形,求矩形中的最长增长路径。只能沿上下左右四个方向。思路算法1枚举起点,然后记搜。算法2排序 + dp创建一个节点node,包含矩阵中每个点的横坐标,纵坐标,值。然后按照值增长的顺序对node进行排序。然后问题转化成了一个变相的LIS。按照条件进行转移即可。代码algorithm 1int dx[] = {-1, 1, 0, 0};int dy[] = {0, 0, -1, 1};c原创 2017-02-22 15:11:36 · 325 阅读 · 0 评论 -
Leetcode 230 - Kth Smallest Element in a BST(dfs)
题意求bst的第k小。思路利用BST的中序遍历是排好序的这个性质做一下就好了。算法1开了额外的O(n)O(n)空间。利用vector保存了一下中序遍历的结果。算法2我们可以这样考虑:在我们中序遍历的时候,每次从左儿子节点返回的时候,代表元素变大了一个。即每次从左儿子返回时,k–。当k为0的时候,即为我们的Kth。可以结合下面的例子理解一下: 比如我们要求第5小,我们遍历的顺序为:(10, 5) -原创 2017-02-13 23:08:24 · 276 阅读 · 0 评论 -
Leetcode 79 - Word Search(dfs)
题意求一个字符串是否能从矩形内某一点出发,沿上下左右走得到。思路dfs。算法1用use[i][j]记录位置[i, j]是否被访问过,dfs就好。算法2我们访问一个位置的时候,把它记为’#’,访问完还原即可。代码//algorithm 1const int maxn = 205;int use[maxn][maxn];class Solution {private: int m,原创 2017-02-17 22:27:15 · 237 阅读 · 0 评论 -
Leetcode 90 - Subsets II(Search)
题意生成一个数组的所以子集。思路和之前的subsets一样,但是关键问题是要去重。算法1很暴力,用一个set套一个multiset来判断当前结果是否出现过。算法2我们先将数组排序,然后开始考虑怎么去重。在含有重复元素的时候,如果当前数和前面一个数相同的时候:当前仅当前面的一个数使用时,当前数字才能使用。 于是,我们添加一个use数组来记录某位置是否访问。算法3不用use数组直接跳过相同的元素。代码/原创 2017-02-17 20:51:17 · 312 阅读 · 0 评论 -
Leetcode 78 - Subsets(枚举)
题意求一个set的所有子集思路算法1二进制枚举算法2回溯法。代码//algorithm 1class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { int n = nums.size(); vector<vector<int>> ans; for (in原创 2017-02-17 15:16:00 · 201 阅读 · 0 评论 -
Leetcode 542 - 01 Matrix (BFS)
题意给一个01矩阵,要求对于矩阵中的每一个格子找到离它最近的0的距离思路首先,对于为0的格子,距离就为0 然后对于为1的格子,可用它的上下左右四个格子去松弛 所以做一遍BFS就好代码struct node { int x, y, step; node() {} node(int a, int b, int c) : x(a), y(b), step(c) { }原创 2017-06-12 16:43:46 · 342 阅读 · 0 评论