算法
文章平均质量分 59
IamCerian
我曾幻想有双翅膀
展开
-
双指针:三数之和
文章目录1、背景介绍2、解题思路2.1 证明双指针算法剪枝的合理性2.2如何去重3、源码分享1、背景介绍给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums =原创 2021-08-08 23:31:42 · 487 阅读 · 0 评论 -
双指针:盛水最多的容器
文章目录1、背景介绍2、解题思路2.1 证明双指针算法剪枝的合理性3、源码分享1、背景介绍n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水的最大值为原创 2021-08-08 22:58:02 · 260 阅读 · 0 评论 -
动态规划:正则表达式匹配
文章目录1、背景介绍2、解题思路2.1状态转移方程2.2初始化3、源码分享1、背景介绍给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素示例 1:输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里原创 2021-08-08 13:47:19 · 544 阅读 · 0 评论 -
C++滑动窗口
文章目录1、题意2、思路3、源码1、题意给定一个字符串s,找出其中不含有重复字符的最长子串的长度。例如输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。2、思路1)贪心从字符串中任意一个位置开始,向两端扩展,直到出现重复的,记录不重复的子串长度。以此方式从s的每个字符开始。2)滑动窗口使用两个指针L,R,R在右边,L在左边,【L,R】表示整个滑动窗口;从s第一个字符开始遍历,若未出现重复的字符,R向右移动,若出现重复的字原创 2021-07-21 21:40:01 · 1398 阅读 · 0 评论 -
动态规划专栏(四):路径问题
文章目录1、背景介绍2、背景理解3、解题思路4、代码详解5、测试用例1、背景介绍给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出: true示例 2:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出: false2、背景理解就字面意思理解,其实很简单,这里想讲的是关于它的扩展。我们原创 2020-07-19 00:45:11 · 399 阅读 · 0 评论 -
最简洁清晰的二叉树非递归遍历:(二)验证二叉搜索树
文章目录一、背景介绍二、解决思路三、源码一、背景介绍给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 ...原创 2020-03-16 22:25:05 · 263 阅读 · 0 评论 -
最简洁清晰的二叉树非递归遍历:(一)前中后序遍历
文章目录一、前序非递归遍历1、算法思路2、源码二、中序遍历1、算法思路2、源码三、后序遍历1、算法思路2、源码四、完整Demo一、前序非递归遍历1、算法思路利用栈先进后出的特性,在一个有三个结点的子树中,先对根节点做出操作,再将右子树结点入栈,再将左子树结点入栈,这样利用栈遍历的顺序就是根----左-----右(因为根已经最先处理)。思路比较简单,直接看源码即可理解。2、源码 void...原创 2020-03-16 22:12:39 · 179 阅读 · 0 评论 -
大道至简的算法:前缀树
文章目录一、概念介绍二、前缀树数据结构详解三、详细代码一、概念介绍Trie (发音为 “try”) 或前缀树是一种树数据结构,用于检索字符串数据集中的键。这一高效的数据结构有多种应用:自动补全拼写检查IP 路由 (最长前缀匹配)T9 (九宫格) 打字预测单词游戏二、前缀树数据结构详解class Trie {private: //表示是否已经到...原创 2020-03-09 23:18:43 · 311 阅读 · 0 评论 -
序列化之二叉树
文章目录一、背景介绍二、思路简述三、代码示例四、补充知识点一、背景介绍序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。你可以将以下二叉树: 1 / \ 2 3 / \4 5序列化为 “[1,2,3,null,null,4,5]...原创 2020-03-09 21:19:58 · 494 阅读 · 0 评论 -
深究字符串压缩:原地压缩+哈夫曼压缩(一)
深究字符串压缩系列一共两大部分,会分别阐述原地压缩算法和哈夫曼算法本文主要内容是原地压缩算法。文章目录一、算法介绍二、算法思想三、算法详解四、补充内容一、算法介绍如果有一个字符串[a,a,a,b,b,c],如果直接这样存储,需6个空间,但如果将其压缩成[a,3,b,2,c]则只需要5个空间,这样就实现了一次压缩。而在压缩的过程中,不再多使用别的内存空间,又将这种算法称为原地压缩算法。二、...原创 2020-03-04 22:46:00 · 451 阅读 · 0 评论 -
动态规划专栏(三):滑动窗口最大值
这道以前认为的难题,今天花了十分钟不到就KO了,纪念下。。。文章目录一、题目概要二、题目理解三、解题思路一、题目概要给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: ...原创 2020-02-27 20:52:36 · 1330 阅读 · 0 评论 -
LRU缓存机制实现(cpp版)
文章目录一、概念二、算法描述三、算法思想四、代码及具体思路一、概念计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,即最...原创 2020-02-25 22:13:42 · 689 阅读 · 0 评论 -
动态规划专栏:(二)最长回文串
文章目录一、题目概要二、题目理解三、解题思路一、题目概要给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”二、题目理解分析题目时思考用什么方法,最长回文串由一个个短回文串组成,这种利用之前的解来帮助后面的问...原创 2020-02-19 21:55:24 · 262 阅读 · 0 评论 -
广度优先搜索:从盒子里获得的最大糖果数
一、题目介绍给你 n 个盒子,每个盒子的格式为 [status, candies, keys,containedBoxes] ,其中:状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为...原创 2020-02-11 19:15:39 · 384 阅读 · 0 评论 -
最短回文串
最短回文串问题回文串——指的是正读和反读都一样的字符串,简单理解就是轴对称。题目背景:给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。例如:输入: “aacecaaa”输出: “aaacecaaa”解决思路是:step1:判断该字符串是是否是回文字符串,如果不是,跳转到step2;step2:找出从字符串第一个字符开始...原创 2019-03-16 15:40:12 · 1090 阅读 · 0 评论