算法
Jekk_cheng
这个作者很懒,什么都没留下…
展开
-
LeetCode之缺失的第一个正数
题目链接:https://leetcode-cn.com/problems/first-missing-positive/解题步骤1:不考虑空间复杂度的话,使用哈希表可以轻松解决问题题目要求只能使用常数级别的额外空间,我们参数才原有数组上模拟哈希表找出没有出现的最小正整数,那么答案只能在[1…n+1],n为数组的大小因为小于等于0的元素不需要考虑,将他们的值设置为n+1接下来,我们需要把下标为nums[ i ] - 1且下标在[0,n-1]的范围的元素值都取反因为是在原数组上操作的,num原创 2020-06-27 23:35:47 · 167 阅读 · 0 评论 -
选择排序的稳定解法
选择排序思想选择排序(Selection Sort)的基本思想是不断地从数组当中未排序的部分选取关键字最小的记录,并将该记录作为已排序部分的最后一个记录(考虑升序排列的情况)。算法主要就是维护一个给定数组的两个子数组:数组已排序的部分;数组未排序的部分;在选择排序的每一次迭代中,从数组中未排序的部分选择出最小元素(升序排列的情况),然后将其移入数组已排序的部分。初始时,给定一个数组,且将该数组当中的所有元素都被划分为无序部分:遍历数组 [0,7],找到下标为 5 最小的关键字 13:下转载 2020-06-23 18:25:41 · 2944 阅读 · 2 评论 -
LeetCode之二叉树中的最大路径和
题目链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/解题步骤:求二叉树的最大路径和,即求以每个节点为根节点的二叉树的最大路径和,再取其中的最大值最大路径和可以通过:root->val + 左子节点最大贡献 + 右子节点最大贡献通过一个变量maxSum随时更新最大路径和接下来,完成每个节点最大贡献的求解就可以求解本题我们以示例2为例: -10 / \ 9 20原创 2020-06-21 15:59:25 · 356 阅读 · 0 评论 -
LeetCode之正则表达式匹配
题目链接:https://leetcode-cn.com/problems/regular-expression-matching/解题步骤:使用动态规划进行求解定义状态:dp[ i ][ j ]表示 s 的前 i 个字符是否能被 p 的前 j 个字符匹配转移方程:从已经求出来的dp[ i - 1 ][ j - 1 ]入手,考虑s[ i ]、p[ j ]的各种情况如果s[ i - 1 ] == p[ j - 1 ] || p[ j - 1 ] == ‘.’,dp[ i ][ j ] = dp[原创 2020-06-20 22:12:59 · 222 阅读 · 0 评论 -
LeetCode之二进制求和
题目链接:https://leetcode-cn.com/problems/add-binary/解题步骤:求和肯定会遇到进位问题,用字符变量carry表示进位,'0’表示没有进位,'1’表示有进位规定字符串a的长度大于小于b的长度,并将结果存在a中首先,从尾部开始遍历b,分情况进行分析:如果carry和b[index]相等,和a[index]求和后,a[index]和carry都不需要改变,所以不需要考虑如果carry和b[index]不相等,a[index] == ‘0’,则a[inde原创 2020-06-19 22:44:11 · 156 阅读 · 0 评论 -
LeetCode之出现次数最多的子树元素和
题目链接:https://leetcode-cn.com/problems/most-frequent-subtree-sum/解题步骤:首先,我们需要求每个节点的子树元素和,每个节点的左右子节点的子树元素和就是该节点的子问题,因此,使用递归进行求解求出子树元素和后,还需要计算其出现的次数,使用hashmap存储子树元素和 和 次数的映射关系并通过一个变量记录出现最多的次数max最后遍历hashmap,找出出现次数为max的子树元素和C++实现:/** * Definition for原创 2020-06-19 22:16:23 · 227 阅读 · 0 评论 -
LeetCode之从先序遍历还原二叉树
题目链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/解题步骤:根据题意,除根节点外,每个节点前面的’-'的数量表示该节点所在的层次由于使用深度优先搜索dfs,所以当一个节点接下来的节点层次小于等于当前层次,说明子节为空,直接返回空指针我们依次遍历字符串中每个节点的值,递归构建二叉树C++实现:/** * Definition for a binary tree node. * stru原创 2020-06-18 22:40:32 · 209 阅读 · 0 评论 -
LeetCode之二叉树的层序遍历
题目链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/解题步骤:题目要求层序遍历二叉树,自然想到使用广度优先搜索BFS进行解题我们可以借助队列queue来实现广度优先搜索基本思路是:先把根接节点放入队列取出根节点,并依次将根节点的非空左节点和非空右节点放入队列对每一层的所有节点都执行与根节点一样的操作,并将节点值放入同个列表中直到队列为空,返回所有列表C++实现:/** * Definiti原创 2020-06-17 22:59:38 · 289 阅读 · 0 评论 -
LeetCode之二叉树的序列化与反序列化
题目链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/解题步骤:通过前序遍历将二叉树序列化为字符串,前序遍历顺序:根节点、左子树、右子树节点间用","隔开,并用"null"表示空节点使用递归,我们可以得到序列:“1,2,null,null,3,4,null,null,5,null,null,”获得序列化字符串后,第一个值为根节点,接下来是左子树节点,右子树节点所以我们可以依次取到节点的值,并使用原创 2020-06-16 23:22:09 · 356 阅读 · 0 评论 -
LeetCode之恢复二叉搜索树
题目链接:https://leetcode-cn.com/problems/recover-binary-search-tree/解题步骤:二叉搜索树的中序遍历所有节点值的升序的,题目可以转换为恢复升序的中序遍历序列中序遍历序列顺序:左子树、根节点、右子树,使用递归获取中序遍历序列获取被交换的两个节点,如果a[ i ] > a[ i + 1],则可以确定第一个被交换节点,如果a[ i ] < a[ i - 1],则可以确定第二个被交换节点最后,交换两个节点的值C++实现:/原创 2020-06-16 22:12:26 · 183 阅读 · 0 评论 -
LeetCode之重建二叉树
题目链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/解题步骤:二叉树的前序遍历顺序:根节点、左子树、右子树,并且对左右子树也采用前序遍历二叉树的中序遍历顺序:左子树、根节点、右子树,并且对左右子树也采用中序遍历所以,在二叉树的前序遍历序列中,根节点值为序列的第一个元素值在二叉树的中序遍历序列中,根节点位于序列的中间,且左子树的节点值位于根节点的值的左边,右子树的节点值位于根节点的值的右边通过前序遍历序列和中序遍历原创 2020-06-15 22:19:03 · 203 阅读 · 0 评论 -
LeetCode之交错字符串
题目链接:https://leetcode-cn.com/problems/interleaving-string/解题步骤:使用动态规划对本题进行求解:定义状态:dp[ i ][ j ]表示字符串s1下标 i 以前的串和字符串s2下标 j 以前的串是否可以交错组成字符串s3的前i + j位的子串。如果dp[ i ][ j ] == true,只需要判断s1[ i ] == s3[ i + j ] ? 、s2[ j ] == s3[ i + j ] ?确定转移公式:dp[ i + 1 ][原创 2020-06-14 19:14:16 · 259 阅读 · 0 评论 -
LeetCode之不同的二叉搜索树
题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees/解题步骤:题目可以转换为求以i(1 <= i <= n)为根节点的不同结构的二叉树数量,然后相加就可以的出答案。假如我们以i为根节点,左子树由[ 1, i-1]构成,右子树由[i+1, n]构成。由于二叉搜索树左节点值小于根节点值,右节点值大于根节点值,并对所有子树都成立,所以左子树[1, i-1]与右子树[i+1, n]与原问题[1, n]是一样的,因此我们使原创 2020-06-13 16:48:35 · 127 阅读 · 0 评论 -
LeetCode之二叉树的中序遍历
题目链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/解题步骤:递归的解法,只需要分三步就可以解决:递归遍历左子树,访问本节点,递归遍历右子树;非递归的解法,我们可以使用栈来实现递归的过程:当前节点cur = root如果cur != NULL, 将节点入栈,更新当前节点为左节点,cur = cur->left;如果cur == NULL,cur = 栈顶元素,并出栈更新当前节点为右节点,cur = cu原创 2020-06-13 12:44:11 · 117 阅读 · 0 评论 -
LeetCode之三数之和
题目链接:https://leetcode-cn.com/problems/3sum/解题步骤:从题意上看,暴力的解法就是使用三重循环遍历数组,判断a + b + c是否等于0,如果等于则将这个组合放进三元组集合中。但是使用这种解法提交时,会超出时间限制,而且很难满足题目中提到的答案中不可以包含重复的三元组的条件。基本思路都是枚举数组中的三个数,判断相加是否等于0,可以选确定a值,再枚举b、c:对数组进行排序选取第i个元素nums[ i ],0 <= i <= nums.size()原创 2020-06-12 22:23:11 · 132 阅读 · 0 评论 -
冒泡排序(Bubble Sort)改进
冒泡排序算法基本步骤:比较相邻的元素,如果第一个比第二个大,就交换他们两个;对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。完成最后一对后,最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。cpp实现1:冒泡排序最普通的实现void BubbleSort(vector<int>& nums) { int size = nums.size(); int原创 2020-06-10 22:30:05 · 222 阅读 · 0 评论