数据结构与算法
sixgold
北邮在读研究生,目前是推荐算法方向~
展开
-
并查集详解 ——图文解说(转)
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,HDU1232畅通工程首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条.转载 2020-06-08 15:56:53 · 211 阅读 · 0 评论 -
Leetcode990. 等式方程的可满足性 C++ 并查集
题目:思路:这是一道并查集的板子,==号我们可以认为两个字母之间存在一条边,先遍历一遍把所有 == 的字母进行连接,然后再次遍历看一下不相等的字母是否在一个连通分量上,那么主要就是怎么连接以及怎么去判断两个字母是否在同一个连通分量上.代码:class Solution {public: int father[26]; bool equationsPossible(vector<string>& equations) { //并查集原创 2020-06-08 15:45:32 · 204 阅读 · 0 评论 -
Leetcode 128. 最长连续序列 C++
题目:思路:对于连续的序列,并不要求顺序,往往要想到map来解决。对于要求子数组满足前后顺序的问题,一般需要滑动窗口来解决。本题不要求顺序,所以借助map来解决。将数组中所有的数先用map存储下来遍历数组,对每一个数,将两边扩展并通过map来判断是否存在,每次更新结果保证当前的最大值。代码:class Solution {public: int longestConsecutive(vector<int>& nums) { //时间复杂度O(n)原创 2020-06-06 10:28:51 · 224 阅读 · 0 评论 -
Leetcode 101. 对称二叉树 递归和迭代。
目录题目递归迭代题目递归递归的思想首先判断是哪种遍历方式,这道题应该是前序遍历,因为要从根节点开始,那么依次判断根的左节点和右节点是否相等。前序遍历递归的结构 dfs(root1->left,root2->right), dfs(root1->right,root2->left)递归结束的条件class Solution {public: bool isSymmetric(TreeNode* root) { if(root == NULL原创 2020-05-31 10:55:59 · 290 阅读 · 0 评论 -
Leetcode 76 最小覆盖子串 滑动窗口 图解
题意 :思路:采用滑动窗口,窗口有左右边界,先通过扩展右边界找出一个包含T中所有字符的子串,然后收缩左边界,直到不能再收缩。记录此时的子串。然后收缩左边界,继续扩展右边界,直到再找到满足要求的子串,和上次的进行比较,保存更小的子串。返回执行,直到右边界到达S串尾,且左边界不能再收缩。C++代码:class Solution {public: string minWindow(string s, string t) { map<char,int> mp;原创 2020-05-23 13:27:17 · 314 阅读 · 0 评论 -
Leetcode 4 寻找两个正序数组的中位数 C++解法思路
题目思路代码这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。这里对于两个有序数组也是一样的,假设两个有序数组的长度分别为m和n,由于两个数组长度之和 m+n 的奇偶不确定,因此需要分情况来讨论,对于奇数的情况,直接找到最中间的数即可,偶数的话需要求最中间两个数的平均值。为了简化代码原创 2020-05-16 13:16:06 · 582 阅读 · 0 评论 -
Leetcode 155. 最小栈 C++ 双栈、单栈双解法。
双栈解法class MinStack {private: stack<int> s1; stack<int> s2;public: /** initialize your data structure here. */ MinStack() { } void push(int x) { s1.push(x); if(s2.empty() || x <= s2.top原创 2020-05-12 22:06:57 · 314 阅读 · 0 评论 -
Leetcode39,40,216,组合总和三道题,通用回溯法+剪枝
目录Leetcode39,组合总和1Leetcode40,组合总和2Leetcode216,组合总和3四道题的思路都是回溯法,回溯法的思路就是暴力遍历,同时使用剪枝来限制缩小搜索的空间,从而降低复杂度。回溯法核心就是dfs,将问题想象为一个层级的树结构,每递归一次,树的深度就+1. 在同层就是下面代码中func函数的for()结构。 下面三道题我是用统一的结构来编写。Leetcode39,组合总和1class Solution {public: vector<vector<int原创 2020-05-09 22:30:03 · 261 阅读 · 0 评论 -
Leetcode 55/45 跳跃游戏 贪心算法
目录Leetcode 55 跳跃游戏1题目代码Leetcode 45 跳跃游戏2题目代码这两道题的思想都是采用贪心思想,通过局部最优,来达到最后的全局最优。Leetcode 55 跳跃游戏1题目代码问题判断是否能达到最后,关键是声明一个reach变量,来记录我们最远到达的距离,那么当reach到达最后一个索引就返回true。我们每次遍历都要更新reach,使得reach每次都是目前能到...原创 2020-05-04 17:39:31 · 559 阅读 · 0 评论 -
Leetcode542,1162 BFS在二维矩阵中的应用
二维矩阵中的BFS,求最短XX的问题1.BFS的核心要点2.Leetcode 542 0 1 矩阵2.1题目2.2代码3.Leetcode1162 地图分析3.1题目3.2代码1.BFS的核心要点一、广度优先搜索思路:对于 「Tree 的 BFS」 (典型的「单源 BFS」) 大家都已经轻车熟路了:首先把 root 节点入队,再一层一层无脑遍历就行了。对于 「图 的 BFS」 (「...原创 2020-04-29 19:48:01 · 375 阅读 · 0 评论 -
Leetcode208 ,820 字典树/Trie树/前缀树介绍以及用途
目录1.字典树/Trie树/前缀树2.Leetcode208 实现 Trie (前缀树)3.LeetCode820 单词的压缩编码1.字典树/Trie树/前缀树字典树又名前缀树,Trie树,是一种存储大量字符串的树形数据结构,相比于HashMap存储,在存储单词(和语种无关,任意语言都可以)的场景上,节省了大量的内存空间。下图演示了一个保存了8个单词的字典树的结构,8个单词分别是:“A”,...原创 2020-04-23 22:38:41 · 375 阅读 · 0 评论 -
剑指offer 反转链表递归 非递归 / 从尾到头打印链表
目录反转链表1.递归2.非递归从尾到头打印链表1.非递归反转链表的题目是链表中非常基础的题目,因此也是面试很常考的题目,对于反转链表需要掌握递归和非递归两种形式。反转链表1.递归对于递归的方法,我们要知道递归的结构,我们要反转head开始的链表,需要先反转head->next的链表,head->next反转之后,可以进行核心的操作语句head->next->next...原创 2020-04-18 20:20:12 · 214 阅读 · 0 评论 -
剑指offer 和为S的连续正数序列 滑动窗口法 解决连续序列问题
目录题目描述核心思想代码题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!核心思想给定一个...原创 2020-04-17 12:08:36 · 179 阅读 · 0 评论 -
剑指offer 调整数组顺序使奇数位于偶数前面(快慢指针)
调整数组顺序使奇数位于偶数前面题目描述核心思想代码题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。核心思想这道题最关键的地方由两部分。奇数都排在偶数的前面保证奇数和奇数,偶数和偶数之间的相对位置不变。如果题目中不要求相对位置。那么其实使用快慢指针,进行s...原创 2020-04-16 20:48:09 · 127 阅读 · 0 评论 -
剑指offer Leetcode 46,47 字符串的排列 全排列问题(通用解法)
目录1.1 题目描述1.2 解题思路1.3 全排列中的字符不重复 (leetcode 46)1.4 全排列中包含重复的字符(leetcode 47)1.1 题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。1.2 解题思路对于全排列问题,不论是字符串的全排列还...原创 2020-04-16 19:37:44 · 307 阅读 · 0 评论 -
LeetCode 145 二叉树后序遍历 递归非递归 通俗易懂的万能模板方法
LeetCode 145 二叉树后序遍历 递归非递归 通俗易懂的万能模板方法1.递归 二叉树后序遍历2.非递归 二叉树后序遍历 万能模板法二叉树的遍历方式作为面试热门考点,相信递归的方式大家都很容易能够写出来,但只掌握递归的方法是不够的,还需要的掌握非递归的方式,介绍一种能够解决前、中、后三种遍历的非递归形式的模板。一次性解决非递归问题!!前序遍历的万能模板法中序遍历的万能模板法1.递...原创 2020-04-15 15:34:26 · 568 阅读 · 0 评论 -
LeetCode 94 二叉树中序遍历 递归非递归 通俗易懂的万能模板方法
LeetCode 144 二叉树中序遍历 递归非递归 通俗易懂的万能模板方法1.递归 二叉树中序遍历2.非递归 二叉树中序遍历 万能模板法二叉树的遍历方式作为面试热门考点,相信递归的方式大家都很容易能够写出来,但只掌握递归的方法是不够的,还需要的掌握非递归的方式,介绍一种能够解决前、中、后三种遍历的非递归形式的模板。一次性解决非递归问题!!前序遍历的万能模板法后序遍历的万能模板法1.递...原创 2020-04-15 15:28:19 · 197 阅读 · 0 评论 -
LeetCode 144 二叉树前序遍历 递归非递归 通俗易懂的万能模板方法
LeetCode 144 二叉树前序遍历 递归非递归 通俗易懂的万能模板方法1.递归 二叉树前序遍历2.非递归 二叉树前序遍历 万能模板法2.1递归和栈的关系2.2 万能模板法二叉树的遍历方式作为面试热门考点,相信递归的方式大家都很容易能够写出来,但只掌握递归的方法是不够的,还需要的掌握非递归的方式,介绍一种能够解决前、中、后三种遍历的非递归形式的模板。一次性解决非递归问题!!1.递归 ...原创 2020-04-15 15:20:55 · 324 阅读 · 0 评论 -
LeetCode 43 通俗易懂 字符串相乘 一个简单的例子描述过程
LeetCode 43 字符串相乘 /** num1的第i位(高位从0开始)和num2的第j位相乘的结果在乘积中的位置是[i+j, i+j+1] 例: 123 * 45, 123的第1位 2 和45的第0位 4 乘积 08 存放在结果的第[1, 2]位中 index: 0 1 2 3 4 1 2...原创 2019-10-09 16:39:40 · 128 阅读 · 0 评论 -
剑指Offer 数组中重复的数最优解思路
剑指Offer 数组中重复的数字最优解bool duplicate(int numbers[], int length, int* duplication)bool duplicate(int numbers[], int length, int* duplication){ if(numbers==NULL || length&amp;amp;lt;=0) //判断空指针异常,以及数组长度为0...原创 2018-12-05 16:36:52 · 344 阅读 · 0 评论