算法
Novice-XiaoSong
这个作者很懒,什么都没留下…
展开
-
算法 实现一个LRU(O(1)的时间复杂度进行set, get)
LRU:Least Recently Used的缩写,即最近最久未使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。一、LRU示例// 假设现在有一个LRU缓存,最大空间为3LRUcache = []// cache 未满LRUcache.set(1,1) // [{1: 1}]LRUcache.set(2,2) // [{1: 1}, {2: 2}]LRUcache.set(3,3) // [{1: 1}, {2: 2}, {3: 3}]// cache 满,最近最久未.原创 2020-11-21 11:53:56 · 401 阅读 · 0 评论 -
算法 topK
给定一个无序数组,以及一个整数k,要求返回无序数组中的第k大的数字解法1:最大堆法(优先队列)原理:利用最大堆的特点,在将无序数组构建成最大堆后,执行k次pop,最后一个元素即为第k大元素实现:js 实现一个堆解法2:快速选择法原理:利用快速排序的分区思想。升序快排中每次分区后都能找到一个pivot,使得右分区的元素都比其大。那么就可以在分区后,根据右分区元素个数,对比k值,在左或右分区中继续分区,进而找到合适的pivot。实现function topK(_nums, _k){.原创 2020-11-14 12:04:07 · 183 阅读 · 0 评论 -
算法 DFS与BFS
一、DFS(深度优先搜索)DFS: 深度优先遍历DFS与树的先序遍历比较类似。假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次访问它的所有邻接结点,每次访问一个邻接结点时,以该邻接结点为根结点继续进行DFS,直到结点的所有邻接结点以及其邻接结点的邻接结点都被访问完,才访问下一个邻接结点并进行同样操作,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。二、BFS(广度原创 2020-11-10 16:46:06 · 117 阅读 · 0 评论 -
算法 从中序与后序遍历序列构造二叉树
leetcode 106 题 [medium]中:从中序与后序遍历序列构造二叉树英:Construct Binary Tree from Inorder and Postorder Traversal切题口(1)postorder: 从右到左递归存放着,当前root, 右子树的root,左子树的root(2)inorder: 当前的root能对数组左右区域进行划分,左侧为左子树结点,右侧为右子树结点(3)从右到左搜索postorder,依次获得当前root、右子树root、右子树的右子.原创 2020-11-07 14:37:46 · 191 阅读 · 0 评论 -
算法 从前序与中序遍历序列构造二叉树
leetcode 105 题 [medium]中:从前序与中序遍历序列构造二叉树英:Construct Binary Tree from Preorder and Inorder Traversal 切题口(1)inorder: 从左到右递归存放着,当前root, 左子树的root,右子树的root(2)preorder: 当前的root能对数组左右区域进行划分,左侧为左子树结点,右侧为右子树结点(3)从左到右搜索preorder,依次获得当前root、左子树root、左子树的左子树的.原创 2020-11-07 14:28:05 · 121 阅读 · 0 评论 -
算法 完全搞懂二分查找(包括左边界、右边界查找)
博主习惯左闭右闭的搜索区间,所以以下三种二分查找方法都是以 [left, right] 作为搜索区间一、基本版target 在数组中重复存在时,不考虑按边界输出,只要找到,立刻输出其下标实现function binarySearch(_arr, _target){ /** * 二分搜索基本版:找到立即输出下标,不考虑需要找左边界还是右边界 * 搜索区间,左闭右闭 * @param {Array} _arr: 升序数组 * @param {Number} _target.转载 2020-11-02 16:31:21 · 1327 阅读 · 1 评论 -
常用内排序算法
一、插入排序原理:比较、插入。将未排序区的数逐一转移到排序区中的合适位置。步骤:从未排序区取一个数,插入到已排序区的合适位置,直到未排序区为空。(插入操作可以转化为从已排序区末尾比较交换)时间复杂度:O(n²)空间复杂度:O(1)实现(升序)/** * 插入排序 * 原理:比较、插入。将未排序区的数逐一转移到排序区中的合适位置。 * 步骤:从未排序区取一个数,插入到已排序区的合适位置,直到未排序区为空。(插入操作可以转化为从已排序区末尾比较交换) * 时间复杂度:O(原创 2020-10-22 15:19:31 · 149 阅读 · 0 评论 -
Dijkstra
Dijkstra用途:计算图中某个源点到其他点的最短路径(单源最短路径)问题引入:计算下图中0点到其它点的最短路径dijkstra题解:说明:1、绿色:已经处理好的结点(已经加入路径中),该值为源点到该结点的最短路径长度。例如0->1,最短路径长度为1。2、红色:当前未处理结点中到源点的最小距离。此时列表第一列的路径为源点到该结点最短路径的前置路径。...原创 2019-08-27 10:02:42 · 133 阅读 · 0 评论