随笔分类 -  算法及数据结构

摘要:从一个最简单也最经典问题说起: 能说一说 System.out.println( 1f == 0.999999999999f );的打印结果是什么吗?这么写有什么问题吗? 对于这样一个问题,回答结果一般也就两种情况。 其实这个题目考察的目的简单而明确:**浮点数在计算机中是如何运算的?写代码时有什么 阅读全文 »
posted @ 2021-06-09 11:59 satire 阅读(982) 评论(0) 推荐(1) 编辑
摘要:什么是跳表 跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层 阅读全文 »
posted @ 2021-05-08 09:23 satire 阅读(833) 评论(0) 推荐(0) 编辑
摘要:常见的缓存算法 LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高。 LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。 FIFO 阅读全文 »
posted @ 2021-05-07 00:22 satire 阅读(590) 评论(0) 推荐(0) 编辑
摘要:外部排序,则是每次进行部分排序,然后将各组部分排序的结果合并,再次排序得到最终的结果. 本文中的程序用最大堆和最大赢者树完成了一个外部排序算法,基本思想如下: 将N个元素的大数组拆成每个元素为M的子数组,得到X=(N/M)个子数组; 对这X个子数组,依次使用堆排序进行排序; 初始化最大赢者树:取出这 阅读全文 »
posted @ 2021-03-18 09:30 satire 阅读(367) 评论(0) 推荐(0) 编辑
摘要:本⽂就借⽯头游戏来讲讲「假设两 个⼈都⾜够聪明,最后谁会获胜」这⼀类问题该如何⽤动态规划算法解决。 博弈类问题的套路都差不多,下⽂举例讲解,其核⼼思路是在⼆维 dp 的基 础上使⽤元组分别存储两个⼈的博弈结果。掌握了这个技巧以后,别⼈再问 你什么俩海盗分宝⽯,俩⼈拿硬币的问题,你就告诉别⼈:我懒得想 阅读全文 »
posted @ 2021-03-17 17:29 satire 阅读(152) 评论(0) 推荐(0) 编辑
摘要:转自经典动态规划:高楼扔鸡蛋 一、解析题目 题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下,你至少要扔几次鸡蛋,才能 阅读全文 »
posted @ 2020-12-20 17:55 satire 阅读(241) 评论(0) 推荐(0) 编辑
摘要:LeetCode 第 312 题,题目如下: title 首先必须要说明,这个题目的状态转移方程真的比较巧妙,所以说如果你看了题目之后完全没有思路恰恰是正常的。虽然最优答案不容易想出来,但基本的思路分析是我们应该力求做到的。所以本文会先分析一下常规思路,然后再引入动态规划解法。 一、回溯思路 先来顺 阅读全文 »
posted @ 2020-12-20 17:15 satire 阅读(244) 评论(0) 推荐(0) 编辑
摘要:什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间 阅读全文 »
posted @ 2020-12-20 15:40 satire 阅读(1089) 评论(0) 推荐(0) 编辑
摘要:Original labuladong 3/9 0-1 背包问题 给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少? 举个简单的例子,输入如下: N = 3, W = 4 wt 阅读全文 »
posted @ 2020-12-19 12:44 satire 阅读(98) 评论(0) 推荐(0) 编辑
摘要:转自我作了首诗,保你闭着眼睛也能写对二分查找 Original labuladong 2/28 本文就来探究几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。 以问答的形式,分析这些细节的差异以及出现这些差 阅读全文 »
posted @ 2020-12-17 21:28 satire 阅读(145) 评论(0) 推荐(0) 编辑
摘要:转载自 回溯算法和动态规划,到底谁是谁爹?文末送书 有的问题如果实在想不出状态转移方程,尝试用回溯算法暴力解决也是一个聪明的策略,总比写不出来解法强。 那么,回溯算法和动态规划到底是啥关系?它俩都涉及递归,算法模板看起来还挺像的,都涉及做「选择」,真的酷似父与子。 那么,它俩具体有啥区别呢?回溯算法 阅读全文 »
posted @ 2020-12-17 14:50 satire 阅读(1701) 评论(0) 推荐(1) 编辑
摘要:From 算法学习笔记(1) : 并查集 Union-Find 算法怎么应用? 定义 并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作: 合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。 初始化 int fa[M 阅读全文 »
posted @ 2020-10-14 10:28 satire 阅读(101) 评论(0) 推荐(0) 编辑
摘要:二叉树遍历 递归遍历 以中序遍历为例: class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> res; inorder(root, res); return res; } void in 阅读全文 »
posted @ 2020-10-14 00:12 satire 阅读(185) 评论(0) 推荐(0) 编辑
摘要:回溯算法 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: # 做选择 将该选择从选择列表移除 路径.add(选择) backtrack(路径, 选择 阅读全文 »
posted @ 2020-10-14 00:07 satire 阅读(716) 评论(0) 推荐(0) 编辑
摘要:动态规划三要素:重叠⼦问题、最优⼦结构、状态转移⽅程。 动态规划的三个需要明确的点就是「状态」「选择」和「base case」,对应着回溯算法中走过的「路径」,当前的「选择列表」和「结束条件」。 某种程度上说,动态规划的暴力求解阶段就是回溯算法。只是有的问题具有重叠子问题性质,可以用 dp tabl 阅读全文 »
posted @ 2020-10-14 00:05 satire 阅读(546) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示