算法
主要内容为LeetCode中算法题的学习笔记。
我是一个小石头
这个作者很懒,什么都没留下…
展开
-
Top-K问题
1 最小堆法这是一种局部淘汰法。先读取前K个数,建立一个最小堆。然后将剩余的所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,则继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆中的数据即为最大的K个数。2 分治法将全部数据分成N份,前提是每份的数据都可以读到内存中进行处理,找到每份数据中最大的K个数。此时剩下NK个数据,如果内存不能容纳NK个数据,则再继续分治处理,分成M份,找出每份数据中最大的K个数,如果M*K个数仍然不能读到内存中,则继续原创 2020-05-11 16:49:49 · 193 阅读 · 0 评论 -
64匹马,8个赛道,找出前4名最少比赛多少场?
结论:最少10次,最多11次第一步全部马分8组,各跑一次,然后淘汰掉每组的后四名。这里需要8次。第二步取每组第一名进行一次比赛,然后淘汰最后四名所在组的所有马。这里需要1次。其实这时候深色区域的马也可以淘汰,且A1可以直接晋级。第三步A2、A3、A4、B2、B3、C1、C2、D1八匹马跑一次,即:在剩下需要排名的马中,除了B1外,其它8匹马跑一次。这里需要1次。分类讨论:1.如果这次排名,B2或C1能进前三名,则加上B1后,B1一定能进前三名,因为B1排名比B2和C1都要靠前。到此转载 2020-05-10 19:42:54 · 755 阅读 · 0 评论 -
C++ STL中常见容器的时间复杂度
map, set, multimap, and multiset上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。增加、查找、删除的时间复杂度都近似为O(logN)。hash_map, hash_set, hash_multimap, and hash_multiset上述四种容器采用哈希表实现,增加、查找、删除的平均时间复杂度均为O(1),最坏情况均为O(N),性能降低是因为要解决冲突...原创 2020-02-08 20:04:53 · 996 阅读 · 0 评论 -
C++ lower_bound 与 upper_bound 函数
头文件: #include <algorithm> 二分查找的函数有 3 个: 参考:C++ lower_bound 和upper_boundlower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。upper_bound(起始地址,结束地址,要查找的数值) 返回的是数值 ...转载 2020-01-29 10:51:11 · 188 阅读 · 0 评论 -
C++运算符优先级
运算符描述例子可重载性第一级别 ::作用域解析符Class::age = 2;不可重载第二级别 ()函数调用isdigit('1')可重载()成员初始化c_tor(int ...转载 2020-01-28 21:19:11 · 135 阅读 · 0 评论 -
一道简单DP题
一.算法题干二.基本思路首先,一看就应该知道这是一道DP题。原因在于其当前结果都依赖于前面计算得到的子结果。区分分治和DP的关键条件就在于算法运行中间阶段的计算结果是否依赖于其子问题的结果,若依赖则为DP,否则为分治。DP题的关键在于找出状态转移方程和初始条件(或者称为边界值)。找出状态转移方程的关键又在于找对一个状态函数。根据我目前的经验,这种状态一般都是一个局部最优结果,如本题就可以设...原创 2019-11-15 09:21:04 · 236 阅读 · 0 评论 -
典型的DP思想(一)
算法题干原创 2019-10-04 17:01:34 · 992 阅读 · 0 评论 -
灵活运用逆向思维
一.算法题干牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。现在,重复执行以下步骤,直到显示所有卡牌为止:从牌组顶部抽一张牌,显示它,然后将其从牌组中移出。如果牌组中仍有牌,则将下一张处于牌组顶部的牌放在牌组的底部。如果仍有未显示的牌,那么返回步骤 1。否则,停止行动。返回能以递增顺序显示卡牌的牌组...原创 2019-10-04 11:50:33 · 220 阅读 · 0 评论 -
LeetCode学习笔记目录(持续更新中...)
LeetCode学习笔记目录(持续更新中...)以下是一些我本人在刷LeetCode算法题过程中的一些思考。1.基于哈夫曼算法的思考2.比特位计数的基本实现与优化3.基于复杂规则的字符串处理4.对于 “递减元素使数组呈锯齿状”题目的思考5.对于典型局部求和问题的思考6.对于典型递归类问题求解的思考7.基于循环问题求解的思考...原创 2019-09-22 19:22:53 · 132 阅读 · 0 评论 -
基于哈夫曼算法的思考
一.算法题干为了装修新房,你需要加工一些长度为正整数的棒材sticks。如果要将长度分别为X 和Y 的两根棒材连接在一起,你需要支付X + Y 的费用。由于施工需要,你必须将所有棒材连接成一根。返回你把所有棒材sticks 连成一根所需要的最低费用。注意你可以任意选择棒材连接的顺序。二.样例样例1:输入:sticks = [2,4,3]输出:14解释:先将2 和3 连接成5...原创 2019-09-22 19:49:50 · 278 阅读 · 0 评论 -
比特位计数的基本实现与优化
一.算法题干给定一个非负整数num。对于0 ≤ i ≤ num范围中的每个数字i,计算其二进制数中的1的数目并将它们作为数组返回。二.样例样例1:输入:2输出:[0,1,1]样例2:输入:5输出:[0,1,1,2,1,2]三.解题思路我一开始想到的是最正统的解法:遍历[0,num]的所有整数,然后对每个整数都不断进行“模2+除以2”的操作,统计这当中模2后得到1的数量(其实也就...原创 2019-09-22 20:09:42 · 137 阅读 · 0 评论 -
对实际工程项目中算法的学习与思考
一.算法题干给你一条个人信息 string S,它可能是一个邮箱地址,也可能是一个电话号码。我们将隐藏它的隐私信息,通过如下规则:电子邮箱定义名称name是长度大于等于 2 (length ≥ 2),并且只包含小写字母a-z和大写字母A-Z的字符串。电子邮箱地址由名称name开头,紧接着是符号 @,后面接着一个名称name,再接着一个点号.,然后是一个名称name。电子邮箱地址确定为...原创 2019-09-23 14:24:25 · 260 阅读 · 0 评论 -
对于“递减元素使数组呈锯齿状”题目的思考
一.算法题干给你一个整数数组nums,每次操作会从中选择一个元素并将该元素的值减少1。如果符合下列情况之一,则数组A就是锯齿数组:每个偶数索引对应的元素都大于相邻的元素,即A[0] > A[1] < A[2] > A[3] < A[4] > …或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3]...原创 2019-09-23 14:36:43 · 287 阅读 · 0 评论 -
对于典型局部求和问题的思考
一.算法题干你的好友是一位健身爱好者。前段日子,他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。他会有一份计划消耗的卡路里表,其中calories[i]给出了你的这位好友在第i天需要消耗的卡路里总量。为了更好地评估这份计划,对于卡路里表中的每一天,你都需要计算他 「这一天以及之后的连续几天」 (共k天)内消耗的总卡路里T:如果T < lower,那么这份计划相对糟...原创 2019-09-23 15:22:35 · 319 阅读 · 0 评论 -
对于典型递归类问题求解的思考
一.算法题干给出一个字符串s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中不应包含任何括号。二.解题思路该题是典型的需要用到递归算法的题目。该题的主要思路是:将整个原始字符串看作三段,第一段是字符串开头到第一个左括号之间的部分,第二段是第一左括号和最后一个右括号中间的部分,第三段是最后一个右括号到字符串最后的部...原创 2019-09-23 15:36:16 · 826 阅读 · 0 评论 -
基于循环问题求解的思考
一.算法题干给你一个整数数组arr和一个整数k。首先,我们要对该数组进行修改,即把原数组arr重复k次。举个例子,如果arr=[1,2]且k=3,那么修改后的数组就是[1,2,1,2,1,2]。然后,请你返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是0,在这种情况下它的总和也是0。由于结果可能会很大,所以需要模(mod)10^9+7后再返回。二.解题思路这道题最朴素的...原创 2019-09-23 15:52:21 · 397 阅读 · 0 评论 -
C++运算效率排序
移位 > 赋值 > 大小比较 > 加法 > 减法 > 乘法 > 取模 > 除法。比如在刷题的时候,就可以使用移位来代替乘除法:3乘以2 等价于 3 << 16除以2 等价于6>>1位运算的速度非常快!...转载 2019-07-27 23:20:29 · 672 阅读 · 0 评论