数据结构与算法
绝世好阿狸
这个作者很懒,什么都没留下…
展开
-
【数据结构与算法】跳表
跳表一种针对链表的快速查询数据结构。理论分析,给定一个静态的链表,如果每两个节点构建一个上层索引链表,查询时间变成On/2。如果再往上构建,变为On/4。一直往上构建到k层,假设k层有x个节点,那么只需要遍历Ox。也就是只有最上层的链表需要遍历,之下的链表最多3个节点是常数级别。又因为最上层的链表数最多为2,所以可以有这个结论:每一层至多遍历3个节点。那么总共几层呢?显然是logn,所以这个跳表的查询时间复杂度是logn。在实际运用的时候,链表会动态添加或者删减,我们需要同步调整索引结构,此时无法完全原创 2021-06-03 10:41:20 · 937 阅读 · 1 评论 -
【数据结构与算法】treemap应用 排序
给一个数组,按照出现次数排序,如果出现相同次数,那么按照大小排序。public static void main(String[] args) { int[] array = {5,10,52,2,2}; int[] r = sort(array); for(int i : r){ System.out.println(i); } } public static原创 2017-09-30 05:29:36 · 293 阅读 · 0 评论 -
【数据结构与算法】查找波峰或者波谷
给定一个没有重复数字的数组,找出里面的波峰或者波谷,没有返回-1。如果有,那么波峰波谷的两侧是单调的。思路是二分查找。返回的条件是找到的中间值比两边都大或者比两边都小。那么如果不满足就需要查找左边或者右边。在判断左右之前,我们需要先判断数组的类型,是包含波峰还是波谷,方法是检测前两个值,如果a[0]>a[1],那么是找波谷,否则找波峰。下面只看波峰的情况,如果a[m-1] 这是存在波峰原创 2017-09-30 01:00:27 · 21301 阅读 · 2 评论 -
【数据结构与算法】拓扑排序
拓扑排序是一种有向图的排序。结果是图中顶点的有序序列,这里假设是降序,那么序列中任意两个顶点vi>vj,如果在图中不存在从vj到vi的边,也就是排序的结果不与图中的顺序违背。排序的思路就是BFS。把整个图分为一层一层的结构,每一次输出一层,每一层层内的点的大小没有指定,所以可以按照任意顺序输出,但是层与层之间是有大小关系的,必须一致。如果是找降序,那么这个思路转换为BFS就是,不断原创 2017-10-07 03:22:35 · 1717 阅读 · 0 评论 -
【数据结构与算法】海量数据解决方案 bitmap
新浪的一道笔试题,后来上网get到新的姿势。首先是一个常识,1亿是10的8次方,1G大概是10的9次方,2的10次方是1024,约等于10的3次方,所以10亿大概是1G。问题:有10亿个无符号整数,问有没有办法在内存不超过1GB前提下,找出所有的只出现了一次的数。这个是一个计数的题目,常规的做法是用一个map存下每一个数字的次数,但是这个会超过内存限制,建简单的计算下:一个数占4个原创 2017-09-18 12:46:46 · 466 阅读 · 0 评论 -
【数据结构与算法】京东笔试题 去右括号
题目:给定一个只包含括号的字符串,且括号是合法的。删除第一个左括号,再删除任意一个右括号,一直重复此操作直到字符串为“”。问:一共有多少种解法。我拿到这道题目,本能的反应就是深搜,结果只AC了一半,一直以为是逻辑有问题,可是想不出来,最后想到可能是超时了,应该加一个备忘录,算是一个经验吧。然后考完看了牛客网别人的算法,发现很好。思路是算出每一个右括号前面有几个左括号,于是可以得到删原创 2017-09-08 23:20:42 · 730 阅读 · 0 评论 -
【Leetcode】33. Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/description/一个递增的没有重复元素的数组,做一次移位操作,然后在数组中查找偶一个元素返回索引,如果没有返回-1。首先要明白递增数组移位以后的特征,必然是前半段总比后半段大,而且各自内部是有序的。很明显这是一个特殊的二分查找。仍然是取得中间元素a[m],之原创 2017-09-06 11:35:07 · 185 阅读 · 0 评论 -
【数据结构与算法】计数排序
是一种非比较类的排序,原理是利用一个辅助数组记录原数组的元素的位置,这个位置体现了大小,最后遍历辅助数组来排序。整个过程没有涉及到数组元素之间的比较。适用场景:待排元素的值有一个范围,并且范围是可以接受的。方法:这里会涉及几个参数,作为接受参数,必须有待排数组A,以及数组值得范围k。在函数实现的内部,要用k新建一个计数数组B,以及一个结果数组C。先说最简单的情形,假设所有待排元素是互异原创 2017-06-14 15:33:31 · 334 阅读 · 0 评论 -
【数据结构与算法】选择算法 selection
选择算法指的是解决选出序列中第n大的元素。比如中位数。方法如下:1.使用priorityqueue,维持size为k,如果queue的size小于k,则直接加入,否则看最小的元素能否比得过,比得过就剔除最小元素,加入新元素,比不过就看后面的元素,最后返回堆顶元素即可。这里需要使用最小堆。public int findKthMax(int[] array, int k){ P...原创 2017-02-16 04:59:13 · 2815 阅读 · 0 评论 -
【数据结构与算法】排序
/** * 一些结论: * (1)所有的简单排序,即On2的,都是稳定排序。稳定排序的特征是比较操作存在于相邻的元素。 * (2)比On2快的,除了归并,其余都不稳定,但是归并需要On空间 */public class Sort { //直接排序,最基本的思路就是在前i个元素已经排好的基础上,把第i+1个元素插入到合适的位置,但插入第i个时,缓存为t,向前遍历,只要大于就后移,直到...原创 2017-01-12 05:12:10 · 263 阅读 · 0 评论 -
【数据结构与算法】二分类型 算法 怎么写
不知大家是否和我有同感,二分类的算法写起来有点吃力,思路很乱。这次研究了下规律。二分涉及的算法主要有二分查找的递归和非递归以及二分插入排序还有找小于某个数的最大值或者大于某个数的最小值(前提是已排序)。二分查找还算简单,后面两个如果不想好写起来很麻烦。二分最核心的思想是“一分为二”,先看中间的元素是否满足需求,如果满足返回,否则再去查看左半边(low,m-1)的中间或者右半边(m+1,hi原创 2017-01-22 12:08:48 · 759 阅读 · 0 评论 -
【数据结构与算法】桶排序
与基数排序法一样,桶排序也是一种排序的思想。待排数据的值必须在一个范围内,然后把这个值域空间划分为若干区块,每一个对应一个桶,把待排数组放入到合适的桶中,再对桶内的数据采用任意一种方式排序。整个时间复杂度分为两部分,第一部分是入桶,为On,第二部分则是所有桶内排序的时间。《算法导论》中证明了这个整体的时间的期望是On的,因此平均情况下是线性。排序算法主要分为两大类:基于比较的,原创 2017-06-14 16:02:39 · 315 阅读 · 0 评论 -
【数据结构与算法】基数排序
这个不能说是完全的一种排序算法,因该是一种思路。是按位来分几个周期排的。为了简单这里以整数为例,当然可以扩展到其他数据,比如时间。假设待排数据最多是d位,那么就先按照个位数排一次,再按十位数。。。最后按最高位。直觉上,因为最高位得决定权最大,应该是先从最高位开始才对,但是仔细想想,应该是最低位开始。因为如果按照最高位先排,那么次高位再排就会影响了之前的次序,相反如果先按最低位排,那么后原创 2017-06-14 15:46:04 · 393 阅读 · 0 评论 -
【数据结构与算法】二叉树 前序 中序 后序 非递归实现 极简
节点:class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int val){ this.val = val; }}前序: public List preorderTraversal(TreeNode root) { List resu原创 2017-10-23 02:56:51 · 228 阅读 · 0 评论 -
【数据结构与算法】base64 原理(转载)
今天排了一个base64的bug,mark一个不错的博客,之后再整理:https://blog.csdn.net/aozeahj/article/details/52507352转载 2018-04-18 19:20:46 · 210 阅读 · 0 评论 -
【数据结构与算法】KMP 字符串匹配
。。。原创 2019-04-03 15:48:17 · 216 阅读 · 0 评论 -
【数据结构与算法】找出字符串中第一个只出现3次的字符
题目:找出字符串中第一个只出现3次的字符分析:举个例子,“bbcccdddbc”应该返回d,而不是b。这个题目有个容易混淆的地方,“第一个出现”怎么衡量?应该以最后一次出现的位置为准,而不是第一次出现的位置。比方说上面的字符串d就比b最后一次出现的早,d是在位置7,而b是位置8。代码:使用两个数组和两趟遍历: private static char f(String s...原创 2019-04-08 12:18:36 · 915 阅读 · 0 评论 -
【数据结构与算法】树zigzag层次遍历
关于层次遍历,用广度优先遍历就行,如果要分层输出,只要加一个size就行。https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List&l...原创 2019-03-31 10:53:51 · 697 阅读 · 0 评论 -
【数据结构与算法】数组 注水问题
一个数组代表一个墙的高度,问说最终可以盛放多少水。public class Main2 { public static void main(String args[]){// System.out.println(TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis())); int arrays...原创 2019-03-31 10:53:44 · 842 阅读 · 0 评论 -
【数据结构与算法】摔鸡蛋
摔鸡蛋问题问题是 有两颗鸡蛋 在第n层不会碎 n+1层会碎 n就是临界楼层 现在需要给出一种找到临界楼层的方案 使得最坏情况下尝试次数最少第一次看到这个题目 可能有点摸不着头脑那我们可以从一种最最常规的方案入手拿着鸡蛋从第一层逐层往上试 该方案肯定可以试出来 那么考虑最坏情况也就是试到100层 需要100次该方案有两个问题一个是最坏情况需要尝试次数太多另一个是只用了一个鸡蛋但是...原创 2019-03-28 12:26:05 · 657 阅读 · 0 评论 -
【数据结构与算法】rand7 生成rand10
rand7:随机生成1-7的数字。那么如何有rand7构建rand10?大致思路有两种:1 舍弃法大多数都是这么叫的。意思是如果有了大的生成小的,可以直接把多与的舍弃掉重新rand。举个例子,如果有了rand10,如何得到rand7?n=rand10,如果n>7,重新rand10,直到n<=7为止。该方法的思路:n=(rand7 - 1) * 7 + rand7,如...原创 2019-04-03 15:40:43 · 894 阅读 · 1 评论 -
【数据结构与算法】素数 判定
判定n是不是素数素数的判定,如果只能被1和本身整除,这个数就是素数。特别地,1既不是素数也不是合数。思路一:从2-n依次判定是不是能整除n; public boolean isPrime1(int n) { if (n <= 1) return false; for (int i = 2; i < n; i ++) ...原创 2019-03-18 12:03:59 · 1616 阅读 · 0 评论 -
【数据结构与算法】令牌桶 vs 漏桶
令牌桶 vs 漏桶二者都能限流,具体的这里就不介绍了,网上一大把,这里主要说下区别。令牌桶:一定速率往桶里注入令牌,请求必须拿到令牌才能被处理。令牌满了丢掉。漏桶:请求以任意速率进入桶里,桶里的请求以一定速率流出桶被处理,如果桶满了,请求被扔掉。其实,二者没有特别大区别,因为令牌桶通过调整令牌放入速率和漏桶通过调整漏出速率在限流的效果是一致的。wiki百科:至于国内博客强行说...原创 2019-03-15 11:10:50 · 1166 阅读 · 1 评论 -
【数据结构与算法】LRU cache
LRUCaceleast recently used cache,使用最近最少使用淘汰策略的缓存。put和get操作都会更新缓存的时间戳。可以基于时间戳实现。但是java里面有现成的实现:linkedHashMap。除了map接口的api,该类内部有一个指针,按照插入顺序链接起来。当然我们可以指定参数accessOrder为true,来让map把刚get过的key移至链表尾部。默认是...原创 2019-03-14 20:23:15 · 707 阅读 · 0 评论 -
【数据结构与算法】顺时针 循环打印 矩阵
问题顺时针循环打印一个矩阵元素。https://www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/难点:如何控制下一步该往哪里走?思路想法一:如何控制下一步?下一步是由当前方向决定的。所以最直观的想法就是维护一个方向变量,然后建立一个偏移量的二维数组,第一维传入的方向,大小为4,第二维是x和y方向的前进量,大小为2...原创 2019-03-14 15:49:48 · 474 阅读 · 0 评论 -
【数据结构与算法】二叉搜索树
//定义:一棵二叉树,对于任意的节点x,若y是x左子树的节点,则y.val <= x.val;若y是x右子树的节点,则y.val >= x.val;class TreeNode{ int val; TreeNode left; TreeNode right; // 这个属性有些操作需要,会是代码更简洁,空间换时间 TreeNode paren...原创 2019-02-20 11:11:37 · 177 阅读 · 0 评论 -
【数据结构与算法】红黑树 详解
简介红黑树是一种特殊的二叉搜索树,满足如下三个性质:1.颜色:节点要么红要么黑,根节点和叶子节点为黑色;2.红色节点不能相邻,或者说红色节点的孩子节点必为黑色;3.任意节点到其叶子结点的所有路径包含相同数目的黑色节点;好,红黑树的定义就是这么简单,那么这么定义的意义何在?我们知道普通的二叉搜索树已经具备了一定的查询效率,但是由于插入和删除操作,树的高度可能变高,甚至退化为链表,这种情...原创 2019-02-19 17:13:53 · 1667 阅读 · 0 评论 -
【数据结构与算法】哈希表
哈希表是一种查询速度非常快的数据结构,通常的数据结构比如链表,查询速度都会与数据结构的大小有关,而哈希表则是O(1)的速度,基本接近于常量。1,大致思路: *采用数组作为容器,因为访问数组只要给定了下标就能立即得到数据,速度很快,不粗在遍历查相等的问题 *对于要存取的数据,通常都会有关键字,用于检索容器中的数据,这个很好理解,类似于数据库持久层中的primary key的概念。现在为了原创 2016-04-11 11:34:52 · 528 阅读 · 0 评论 -
【剑指offer】题目4
题目:给定一个字符数组,存放长度为len的字符,且数组还有很多剩余的空间,要求把数组中的空格替换为“%20”。要求只在给定的数组上操作,不能另外增加数组。一个简单的实现是,len位置开始生成新的数组,一边从0位置开始遍历,一边把值赋到len位置开始的新数组,然后再把len位置的数组移到0位置。这个方法是On级别,但是需要2n+的空间。更好的办法是从末尾开始。就是先统计空格的数目,然后就原创 2017-06-25 16:53:41 · 234 阅读 · 0 评论 -
【剑指offer】题目10
计算出一个int数字的二进制1的数目。一个简单的思路是移位操作,然后每一次都与1做and。复杂度是O32.一个更好的办法利用了下面的事实,一个数字与该数字减一以后的值做and运算,就可以消除这个数字最右边的1。这是一个很有用的结论。所以有多少1,就会执行多少次and。 public static int countOne(int i){ int count = 0; while原创 2017-06-25 17:27:28 · 230 阅读 · 0 评论 -
【数据结构与算法】backtracking 回溯法
backtracking也是一种编程思想,使用到了递归。backtracking要解决的问题大致具有这样的特征,为了得到问题的解,需要进行若干步骤,每一步的抉择都是相同的,每一步都是在上一步的基础上完成的,需要记录之前的轨迹,直到终点情况,不过有可能是正确也有可能是错误。比如最典型的N皇后问题。需要部署N个皇后,每一次部署都有N种可能。其程序在实现上满足下列特征:(1)每一步的处理,先原创 2017-02-14 08:59:19 · 4196 阅读 · 0 评论 -
【Leetcode】312. Burst Balloons
第一种思路可以采用backtracking。把一个list传递下去,每一步可以选择任意一个删除,然后再递归处理下一个,比较简单。 public int maxCoins1(int[] nums) { if(nums == null || nums.length == 0) return 0; List list = new ArrayList<>(); for(int i : nu原创 2017-02-22 10:36:39 · 323 阅读 · 0 评论 -
【Leetcode】301. Remove Invalid Parentheses 移除非法小括号
题目https://leetcode.com/problems/remove-invalid-parentheses/?tab=Solutions。题意是给出一个string,其中的小括号可能不配对,移除不配对的括号,返回所有的解。首先,如何判断括号是否合法。可以用栈,这也是栈这个数据结构的一个典型应用。也可用一个count计数器,遇到左括号++,右括号--,一旦count小于0,就说明不原创 2017-02-21 12:32:38 · 1598 阅读 · 1 评论 -
【数据结构与算法】二叉搜索树 及 常用操作
/** * @author miracle * bst是一棵二叉树,具有如下性质,对于任意一个结点p,左子树的任意一个节点都小于p,右子树的任意一个结点都大于p。 * 当然也有定义加上等于,但是这里不考虑等于,问题会简化,参照leetcode的定义。 */class TreeNode{ int val; TreeNode left; TreeNode right; Tree原创 2017-02-12 06:11:29 · 271 阅读 · 0 评论 -
【Big data】外部排序
外部排序指要排序的数据大于内存空间的排序。是out-of-core算法。out-of-core算法的时间复杂度高度依赖IO次数,因为对内存的读取速度远远大于对disk的读取速度。所以内存中的处理时间可以不计,整个算法的复杂度由IO次数决定。IO的操作又是以block为基础的。假设内存大小为M,block大小是B,排序数据是n。第一种是2-路排序。1.首先把数据分成n/M组,每一组调入内原创 2017-02-20 10:30:34 · 414 阅读 · 0 评论 -
【面试】lliveramp 面试题 面经 最大时刻问题
给出四个int数字,让返回可以组成的合法的最大的24小时时刻。格式为“HH:MM”。比如1,2,3,4,返回23:41,如果无法组成,返回“not possbile”。答完题以后发现自己漏了一种情况。。。忧伤。。。思路是把数字放入数组,然后排个序,方便处理。(1)先检测o位,如果大于2,返回不可能;(2)处理前两位。最小的数字一定是0或者1或者2。分别考虑这三种情况,从高到低。原创 2017-02-19 13:00:39 · 647 阅读 · 0 评论 -
【面试】Liveramp 面试题 面经 子序列问题
以上参考:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=138979&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3089%5D%5Bvalue%5D%5B5%5D%3D5%26searchoption%5B3089%5D%5Btype%原创 2017-02-19 01:41:44 · 508 阅读 · 0 评论 -
【面试】Liveramp 面试题 面经 猴子过河问题
题目和青蛙过河有一点不同,A数组值是时间,因为我们需要按时间先后来处理,因此首先想到对值排序,但是复杂度会是nlogn,与题目不和。再看题目要求空间是哦(N+MAX(A)),因此可以新建一个数组,size为maxA,那么直接把值和索引兑换一下,空间换时间,就是On级别了。之后与青蛙过河完全相同。public int monkeyCross(int D, int[] A, int N){ i原创 2017-02-19 00:59:19 · 1656 阅读 · 0 评论 -
【面试】Liveramp 面试题 面经 青蛙过河问题
题目如上图所示,截取自http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=142004&highlight=liveramp说下自己的思路,首先可以肯定的是需要遍历时间数组。每一个时间看一下能否到达。第一个思路是用backtracking,每一个时间检测一次,时间复杂度基本是O(DN^2)。事实上,对于线性的所搜或者可达原创 2017-02-18 11:56:46 · 2155 阅读 · 0 评论 -
【数据结构与算法】最大子序列
今天在刷leetcode的时候,发现了一个求最大子序列的算法,Kadane算法。最大子序列问题,给定一个数组,求出最大的连续元素之和。Kadane算法是DP(动态编程)的一种。思路是求出以数组中所有元素为结尾的最大子序列,返回其中最大的。max_cur表示以当前元素为结尾的子序列最大和,max_array表示所有当中的最大和,代码相当简洁。如果要求不能返回负数和: public i原创 2017-01-14 00:12:11 · 284 阅读 · 0 评论