随笔分类 - 算法
摘要:#力扣链接:146. LRU 缓存机制 思路:哈希表 + 双向链表 为什么必须要用双向链表? 因为我们需要删除操作。删除一个节点不光要得到该节点本身的指针,也需要操作其前驱节点的指针,而双向链表才能支持直接查找前驱,保证操作的时间复杂度 O(1)。 为什么要在链表中同时存储 key 和 val,而不
阅读全文
摘要:堆: 一般我们提到的是二叉堆,是一种完全二叉树,二叉堆有两种:最大堆和最小堆。特点是父节点的值大于(小于)子节点 基础知识 完全二叉树有一个性质,除了最底层,每一层都是满的,这使得堆可以利用数组来表示,如下图 对给定某个结点下标i,可以计算出这个结点的父节点、孩子节点的下标: 父节点下标:i/2 左
阅读全文
摘要:今天刷力扣碰到要求最大公因数,总结一下。 方法 用到的方法是辗转相除法,具体思路如下: 代码实现 func gcd(a,b int)int{ if a%b==0{ return b } return gcd(b,a%b) } 或者 func gcd(a,b int)int{ for a%b!=0{
阅读全文
摘要:冒泡排序 冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需
阅读全文