
算法
Lailikes
这个作者很懒,什么都没留下…
展开
-
二分查找的模板
while (low <= high) { int middle = (low + high) / 2; if (target == nums[middle]) { return nums[middle]; ...原创 2018-08-05 11:01:47 · 195 阅读 · 0 评论 -
图解Treap
https://blog.youkuaiyun.com/simpsonk/article/details/72832959Treap = Tree + Heap.树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对于其他的平衡二叉搜索树,Treap的特点是实现简单,且能基本实现随机平衡...转载 2019-04-24 09:27:49 · 208 阅读 · 0 评论 -
排名树RankTree
在所有的平衡树(AVL、红黑树、Treap......)都可以做成RankTree。RankTree主要在平衡树的基础上多支持两个功能:Kth(k):查找第k小的元素 Rank(x):x的名次,即x是第几小的元素如上两个函数都可以在O(logN)的复杂度里完成为此Node结构体需要改进(加入了s字段):struct Node // Rank Tree结点的定义{ Nod...原创 2019-04-24 09:53:39 · 1314 阅读 · 0 评论 -
B树、B-树、B+树、B*树之间的关系
B树B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树(常有人说B减树,这种说法是错误的)。特此说明。先介绍下二叉搜索树 1.所有非叶子结点至多...转载 2019-05-06 11:20:29 · 233 阅读 · 0 评论 -
容器和算法
● 请你来说一下map和set有什么区别,分别又是怎么实现的?参考回答:map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。由于 map 和set所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 map 和set的操作行为,都只是转调 RB-tree 的操作行为。map和set区别在于:(1)map中的元素是key-value(关键字—值)对...转载 2019-05-16 20:52:22 · 818 阅读 · 0 评论 -
从1到n整数中1出现的次数:O(logn)算法
1. 题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。2. 题目来源第一次看到是在《剑指Offer》第2版上,面试题32。leetcode和牛客网上都有这道题。3. 本文的目的看了《剑指Offer》上的解法,我觉得不能算好:这段解释描述有些不清晰,而且没有图,难以...转载 2019-06-02 10:41:30 · 388 阅读 · 0 评论 -
算法与数据结构
一、树● 请你来说一说红黑树和AVL树的定义,特点,以及二者区别参考回答:平衡二叉树(AVL树):平衡二叉树又称为AVL树,是一种特殊的二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。一句话表述为:以树中所有结点为根的树的左右子树高度之差的绝对值不超过1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可...转载 2019-06-04 09:53:38 · 947 阅读 · 0 评论 -
计算日期间隔天数的经典算法解析
#include <iostream>using namespace std;int mon[12] = { 0,31,59,90,120,151,181,212,243,273,304,334 };//字典int cal(int y, int m, int d)//给出年月日,计算距离0000年0月1日的天数和{ return y * 365 + y / 4 - y...转载 2019-07-03 14:25:08 · 3127 阅读 · 1 评论 -
浅析套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Socket的基本背景在讨论这两个选项的区别时,我们需要知道的是BSD实现是所有socket实现的起源。基本上其他所有的系统某种程度上都参考了BSD socket实现(或者至少是其接口),然后开始了它们自己的独立发展进化。显然,BSD本身也是随着时间在不断发展变化的。所以较晚参考BSD的系统比较早参考BSD的系统多一些特性。所以理解BSD socket实现是理解其他socket实现的基石。下面...转载 2019-07-03 16:27:48 · 210 阅读 · 0 评论 -
levelDB中的LRU
https://www.jianshu.com/p/9e7773432772在诸多的Cache策略中,LRUCache(Least Recently Used,最近最少被使用)因为完美地契合了局部性原理,故而成为最常见的Cache策略。而Cache算法的设计与实现,也是面试中经常会遇到的问题。下面,让我们来看一下LevelDB中的LRUCache实现。单条缓存记录:LRUHandle...转载 2019-04-11 15:18:42 · 630 阅读 · 0 评论 -
LRU原理和Redis实现
https://zhuanlan.zhihu.com/p/34133067看了评论,发现有些地方有问题,更新了图和一些描述,希望可以更清晰一些,也欢迎关注,还会有干货文章--------很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU。我的第一反应是操作系统课程里学过,应该是内存不够的场景下,淘汰旧内容的策略。L...转载 2019-04-11 14:24:31 · 189 阅读 · 0 评论 -
通过Jump Game 展示动态规划的思维过程 LeetCode 55. Jump Game
https://leetcode.com/problems/jump-game/方法一:递归(回溯、DFS) 超时在递归树的叶子节点判断,如果能够达到将成员变量置为trueclass Solution {public: bool result; void fun(vector<int>& nums, int start) { if (start>...原创 2019-03-09 20:17:03 · 255 阅读 · 0 评论 -
c++ 两个set合并
C++17提供set和unordered_set的merge,但是C++11并不提供,但依然有简便的方法实现两个set的合并(求并集),如下:set<int> a,b;//合并到aa.insert(b.begin(),b.end());...原创 2018-10-10 10:50:09 · 19104 阅读 · 4 评论 -
最少砝码称量1到100重量问题
问题:需要使用砝码测量1,2,3,4......,99,100所有重量的物品,最少需要多少个砝码?最直观的感受是直接使用1,2,4,8......,64 。也就是2^0,2^1,2^2......2^6,一共7个砝码,因为任何数字都可以表示成二进制数,比如100用二进制表示就是:1100100,所以使用2^2,2^5,2^6三个砝码即可。任何数字都可以表示为二进制数,在这里就意味着任何重量都可...原创 2019-01-18 11:18:55 · 9172 阅读 · 2 评论 -
后缀数组与倍增算法
后缀数组定义:https://www.geeksforgeeks.org/suffix-array-set-1-introduction/详解后缀数组https://blog.youkuaiyun.com/reverie_mjp/article/details/51175926注意rank数组是所有后缀字典排序后的排名顺序 详解倍增算法https://www.cnblogs.com/nietz...转载 2019-01-22 16:02:05 · 313 阅读 · 0 评论 -
LeetCode 287 Find the Duplicate Number
这道题目要求在含有n+1个数字的数组中找出唯一一个出现多次的数字,而这些数字的范围是1-n,要求不改变数组本身以及常数空间。首先我想到的办法是用Bitmap,即一个整型的数字X来表示某个数字是否出现过,如果出现过,那么就在X中对应的位置1。但是这个前提即使n不能太大了,否则整型的数字存储不下。反正这道题用了long long也不行。这道题目看了别人的解答,可以说非常巧妙了。因为数组的范围是...转载 2019-02-23 11:30:33 · 196 阅读 · 0 评论 -
使用递归方法逆序一个Stack (空间复杂度O(1))
#include <iostream>#include <stack>using namespace std;int GetSackBotton(stack<int>& stk)//递归,抽出栈低元素{ int n = stk.top(); stk.pop(); if (stk.size() == 0) return n; i...原创 2019-02-23 17:48:22 · 416 阅读 · 0 评论 -
使用ios::sync_with_stdio(false) 来提高输入输出性能
cin和cout用起来很方便,但是性能不及scanf和printf,我们可以使用std::ios::sync_with_stdio(false);来提升cin和cout的性能与sanf和printf相当原创 2019-03-05 09:16:13 · 531 阅读 · 0 评论 -
头条上机算法题(最大点问题)
P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。思路:对于所有的点先按照y从大到小排序O(N...原创 2019-03-05 09:29:20 · 910 阅读 · 0 评论 -
使用Floyd算法图求直径
https://www.cnblogs.com/Ran-Chen/p/9219716.html转载 2019-03-08 21:40:58 · 1671 阅读 · 0 评论 -
判断整数溢出
https://blog.youkuaiyun.com/bichenggui/article/details/4734040c语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数会被转换为无符号数(表示范围小的总是被转换为表示范围大的),...转载 2019-07-15 16:21:11 · 311 阅读 · 0 评论