DFS
DFS
ShenHang_
一个编程小菜鸡
展开
-
组合总和(回溯)
思路:回溯法+剪枝法(相当不错的题目)如输入: candidates = [2, 3, 5, 7],target = 7,所求解集为: [[2, 2, 3],[2,5], [7]]为了防止出现结果重复的情况(如[2,5]和[5,2]其实是同一个结果),对原始数组先进行升序排序,这样就能保证当前剪枝的值>=上一次剪枝的值。#include <iostream>#inc...原创 2019-12-13 17:15:29 · 277 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历(题中强制要求用迭代算法,不能用递归)
思路:1.初始两个栈s1,s22.栈s1保存根结点3.栈s1弹出p=s1.top()并将p存入栈s2,p->left先入栈s1,p->right再入栈s14.重复步骤3,直至栈s1为空5.栈s2按序弹出,并存入在容器res中,直至栈s2为空class Solution {public: vector<int> postorderTraversal(Tree...原创 2020-03-10 21:52:56 · 347 阅读 · 0 评论 -
另一个树的子树&树的子结构(双递归)
class Solution { //双递归!public: bool isSubStructure(TreeNode* A, TreeNode* B)//遍历A树的每一个结点,每个结点都当一次根结点 { if (A==NULL||B==NULL) return false; return DFS(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B); .原创 2020-07-24 16:23:48 · 176 阅读 · 0 评论 -
二叉树中的最大路径和(DFS)
这道题又是相当漂亮的递归。我的思路:DFS+后序遍历如图所示,题目所说的二叉树中的路径可以分为以下四种:case1:单一结点case2:某个结点及其左子树组成路径case3:某个结点及其右子树组成路径case4:某个结点及其左右子树组成的路径要注意其中类型4的路径是无法作为子路径返回给上一级结点的(原因我画了个图)显然,上面这种路径出现了分叉,不合题意。所以,case1,case2,case3的子递归结果可以传给上一级递归,case4的子递归结果不可以传给上一级递归。但是更新max_.原创 2020-05-31 18:01:55 · 1327 阅读 · 0 评论 -
寻找两个正序数组的第K大元素(思路很难想到)
这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。为了简化代码,不分情况讨论,我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。这里我们需要定义一个函数来在两个有序数组中找到第K个.原创 2020-05-24 22:24:52 · 728 阅读 · 0 评论 -
后缀树的实现
第一次遇到后缀树这种数据结构,所以就去理解了一下,感觉原理不难懂,但是相比于前缀树,后缀树的代码实现还是有点麻烦。后缀树常用于在母串s中查询子串p是否存在,并查询子串在母串中开始的位置给一个例子://后缀树的实现class SuffixTreeNode{private: map<char, SuffixTreeNode*>children;//记录当前结点的子结点信息 vector<int>indexes;//记录子串在父串中的起始位置public: void原创 2020-05-24 10:31:27 · 578 阅读 · 0 评论 -
是否为平衡二叉树(自顶向下、自底向上)
法1:暴力法(自顶向下)这种方法最容易想到,但是每一个结点都会被遍历多次,时间复杂度太高!class Solution {public: bool isBalanced(TreeNode* root) { if (root == NULL) return true; int diff = abs(depth(root->left) - depth(root->right)); //当前结点的左右子树的高度差 if(diff>1) return false; .原创 2020-05-16 22:40:08 · 330 阅读 · 0 评论 -
验证二叉搜索树(DFS)
思路很好想到,利用中序遍历进行检验,那么只需要用一个pre来记录当前结点的前一个结点的val即可。class Solution {private: long pre = LONG_MIN;public: bool isValidBST(TreeNode* root) { if (!root) return true; if (!isValidBST(root->left))//左子树已经完成判断 return false; if (root->val <.原创 2020-05-16 21:45:47 · 255 阅读 · 0 评论 -
路径总和Ⅲ(双递归)
这题是我遇到的第一个双递归的题目,这题和路径总和ⅠⅡ(回溯法)的唯一不同在于它没有限定路径的起点(不一定要求是根结点),也没有限定路径的终点(不一定要求是叶子结点)。所以就要用到双递归了。我的代码如下://双递归class Solution {public: int pathSum(TreeNode* root, int sum) { if (root == NULL) return 0; DFS_2(root, sum); return res; } void DFS_.原创 2020-05-16 17:48:06 · 283 阅读 · 0 评论 -
二叉树的最近公共祖先(DFS)
这题是非常好的递归题!!class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == NULL)return NULL;//递归结束的条件 if (root == p || root == q)//递归结束的条件 return root; TreeNode*left = lowestCommonAncestor(root.原创 2020-05-10 22:28:14 · 266 阅读 · 0 评论 -
搜索旋转排序数组(二分+DFS)
思路:一分为二,有序的使用二分查找法,无序的递归调用本算法。class Solution {public: //一分为二,有序的使用二分查找法,无序的递归调用本算法 int search(vector<int>& nums, int target) { return DFS(nums, 0, nums.size() - 1, target); } int DF...原创 2020-04-27 11:14:54 · 146 阅读 · 0 评论 -
岛屿数量(DFS)
很好的一道DFS,一次就通过。class Solution {public: //一旦发现是岛屿,那么把这个岛屿上的全部1都置为0 int numIslands(vector<vector<char>>& grid) { int count = 0; for (int i = 0; i < grid.size(); i++) for (...原创 2020-04-20 15:55:56 · 384 阅读 · 0 评论 -
191128题(机器人的运动范围(回溯))
思路:和矩阵中的路径那道题相似,甚至稍微简单了一点,仍然是回溯问题。#include<iostream>using namespace std;class Solution {public: int movingCount(int threshold, int rows, int cols) { int count = 0; if (threshold <=...原创 2019-11-20 23:03:59 · 187 阅读 · 0 评论 -
删除二叉搜索树中的节点(DFS)
思路还是很清晰的,这题我觉得很有趣啊。class Solution {public: TreeNode* deleteNode(TreeNode* root, int key) { if (!root) return root; if (root->val < key) { root->right = dele...原创 2020-03-27 10:39:23 · 177 阅读 · 0 评论 -
打家劫舍ⅠⅡⅢ(dp+记忆化搜索)
class Solution {public: int rob(vector<int>& nums) { //dp[i]表示0~i个房间能够偷窃到的最高金额 //dp[i] = max(dp[i-2]+nums[i],dp[i-1]); int len = nums.size(); if (len == 0)return 0; if (len == 1...原创 2020-03-12 21:49:55 · 206 阅读 · 0 评论 -
奶牛家族(斐波那契数列的快速幂乘矩阵算法)
TX面试题:已知有一头牛4年后开始生小牛,一次只能生一只,问20年后有多少头牛这种问题明显具有递归性质:这头奶牛在第四年后能不断生子直到第二十年,其子出生4年后又能不断生子,其子之子出生四年后又可以生子其实每头奶牛生子的特性是一样的:出生第4年开始生子,每一年生一只,而子生子又生孙实际上就是一种递归,不断调用奶牛的生子特性代码如下:#include <iostream>...原创 2020-03-11 16:22:09 · 550 阅读 · 0 评论 -
K个一组反转链表(特别好的DFS)
这道题有很强的的递归思维!思路:1.递归实现含有k个结点的链表的反转;2.递归实现各个组的反转。class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { int count = 0; ListNode*p = head; while (p != NULL&&count ...原创 2020-03-09 22:05:44 · 151 阅读 · 0 评论 -
合并k个排序链表(优先级队列的运算符重载或归并算法)
优先级队列要求,当容器的元素类型是类或者结构体时,“<”运算符必须有定义,优先级队列默认情况下就是按“<”运算符来决定元素大小的。例子如下:#include<stdio.h> #include<functional> #include<queue> #include<vector> using namespace st...原创 2020-03-05 17:04:18 · 441 阅读 · 0 评论 -
解数独(回溯)
我觉得这题的思路还是很简单的,回溯法就是模拟人解数独时的简单想法:人在解数独的时候要注意每一行、每一列、每一个子数独中哪些数字已经被使用过了;一行一行的进行填充,填充完一行就到下一行继续填充;如果一个单元格中不为空,则去下一个单元格;如果一个单元格为空,我们就看一下这个单元格所属的行、列、子数独中有哪些数字没有使用过,就将未使用过的数字填入单元格,并且记录这个被填入的数字在此单元格所...原创 2020-03-03 17:24:30 · 341 阅读 · 0 评论 -
N皇后(回溯)
ps:皇后可以攻击同一行、同一列以及左上角、右上角、左下角、右下角这些角度方向上的任意单位。class Solution {public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>>res; vector<vector<int&...原创 2020-02-29 17:52:50 · 193 阅读 · 0 评论 -
全排列ⅠⅡ(回溯+剪枝)
class Solution {public: vector<vector<int>> permute(vector<int>& nums) { vector<int>temp; vector<vector<int>>res; DFS(res, temp, nums, 0); return res...原创 2020-02-28 14:43:54 · 456 阅读 · 0 评论 -
子集ⅠⅡ(回溯+剪枝)
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> temp; DFS(res, nums, 0, temp); return r...原创 2020-02-27 17:21:59 · 244 阅读 · 0 评论 -
牛牛的背包问题(网易(DFS))
#include<iostream>#include<vector>#include<cmath>using namespace std;typedef long long LL;void DFS(LL sum, int cur, int n, vector<LL>&v, LL w, int &count){ if (...原创 2020-02-27 16:19:52 · 147 阅读 · 0 评论 -
合并两个有序链表(双指针或递归)
两种思路:双指针或递归思路1:双指针,贼简单,正常逻辑struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {...原创 2020-02-08 21:38:34 · 369 阅读 · 0 评论 -
200207题(美团)
#include<iostream>#include<algorithm>#include<vector>using namespace std;int sum = 0;const int N = 100000;vector<int> v[N];//思路: 其实就是每条边都会走两遍,一共有n - 1条边,所以2*(n - 1), 最...原创 2020-02-04 20:03:48 · 186 阅读 · 0 评论 -
200204题(括号生成(DFS))
递归三部曲:class Solution {public: vector<string> generateParenthesis(int n) { vector<string> res; DFS(res, "", 0, 0, n); return res; } void DFS(vector<string> &res, stri...原创 2020-02-02 19:12:38 · 198 阅读 · 0 评论 -
二叉树的Morris遍历算法
法1:中序遍历//如果对没有错误的二叉树进行中序遍历,应该是按升序排列的 //那如果对两个结点交换了顺序,那一定有两个地方不满足“前一个元素 < 当前元素 < 后一个元素” class Solution {private: TreeNode* first = NULL; TreeNode* second = NULL; TreeNode* pre = new Tree...原创 2020-02-01 21:29:56 · 642 阅读 · 0 评论 -
电话号码的字母组合(DFS+回溯法)
思路:回溯法#include<iostream>#include<map>#include<vector>#include<iterator>#include<string>using namespace std;map<char, string> mp = { { '2',"abc" },{ '3',"de...原创 2020-01-06 16:19:32 · 414 阅读 · 0 评论 -
图的遍历(典型的DFS)
任务:DFS遍历这个无向图不多解释,理解了思路以后代码不难写:#include<iostream>using namespace std;#define MAXVEX 10typedef struct { char vexs[MAXVEX];//顶点表 int arc[MAXVEX][MAXVEX];//邻接矩阵 int numVEXS;//顶点个数}MGraph;...原创 2020-01-07 16:55:06 · 236 阅读 · 0 评论 -
200123题(递归三部曲,以13道典型题为例)
本题的三部曲:1.找终止条件。 什么情况下递归终止?没得交换的时候,递归就终止了。因此当链表只剩一个结点或者没有结点的时候,自然递归就终止了。2.找返回值。 我们希望向上一级递归返回什么信息?由于我们的目的是两两交换链表中相邻的结点,因此自然希望交换给上一级递归的是已经完成交换处理,即已经处理好的链表的头结点。3.本级递归应该做什么。 结合第二步,由于只考虑本级递归,这个链表在我们眼里其...原创 2020-01-22 22:18:08 · 283 阅读 · 0 评论 -
200126(递归实现归并排序)
依然是递归三部曲:1.递归什么时候结束:当start和end相等时,无法继续再分下去。2.递归返回的是什么:返回的是已经完成归并排序的子数组(即返回的是升序序列)。3.每个递归中要做什么:对两个已经完成归并排序的子数组[start,mid]和[mid+1,end]重新进行归并排序。#include<iostream>#include<vector>#inclu...原创 2020-01-26 22:10:22 · 408 阅读 · 0 评论 -
组合总和II(回溯)
只需在组合总和那道题上进行一些小改动即可,整体思路还是剪枝+回溯(DFS)#include <iostream>#include <vector>#include<algorithm>using namespace std;class Solution {private: vector<int>cur; vector<vect...原创 2020-01-27 16:15:33 · 156 阅读 · 0 评论 -
路径总和ⅠⅡ(回溯法)
class Solution {public: vector<vector<int>> pathSum(TreeNode* root, int sum) { if (root == NULL) return res; DFS(root, sum); return res; } void DFS(TreeNode* root, int sum) {...原创 2020-01-27 20:52:32 · 251 阅读 · 0 评论 -
200129题(递归三部曲)
相当漂亮的一道递归题,递归三部曲。class Solution {public: void flatten(TreeNode* root) { if (!root) return; flatten(root->left); flatten(root->right); //左右子树已经转换成链表 TreeNode* temp = root->rig...原创 2020-01-27 21:27:51 · 138 阅读 · 0 评论 -
200130题(递归(自上而下递归,比较简单))
核心:自上而下class Node {public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : val(_val), left(NULL), right(NULL), next(NU...原创 2020-01-29 21:30:10 · 309 阅读 · 0 评论 -
200201题(递归三部曲)
class Solution {public: int sumNumbers(TreeNode* root) { return DFS(root, 0); } int DFS(TreeNode* root, int sum) { if (root == NULL) return 0; if (!root->left && !root->ri...原创 2020-01-30 21:27:21 · 134 阅读 · 0 评论 -
200131题(法1.递归,法2.中序遍历+递归)
法1:递归(DFS)class Solution {public: bool DFS(TreeNode* root, long low, long high) { if (root == NULL) return true; return !(root->val <= low || root->val >= high) && DFS(roo...原创 2020-01-30 20:59:06 · 119 阅读 · 0 评论 -
200202题(前序、中序构建二叉树,中序、后序构建二叉树)
自己习惯的最传统的方法(内存开销大了点):class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.size()==0) return NULL; v...原创 2020-01-31 20:55:21 · 331 阅读 · 0 评论