![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 91
馬冬梅啊
这个作者很懒,什么都没留下…
展开
-
算法 (三)快速排序、堆排序、堆结构应用:获取最小的K个数、获取中位数
1、快速排序时间复杂度O(N*logN),额外空间复杂度O(logN)1.1 简单分析这里只讲快排的完善版本:三项切分的随机快排将一个数组分为小于一个数,等于一个数,大于一个数的三部分(主要是下面的partition函数来实现),为了节省变量,默认取最右边的数(这里用随机交换处理了一下,防止复杂度对数据有依赖),然后遍历数组,递归。1.2快排的复杂度分析:常数项很少,在时间复杂度都为O...原创 2019-01-24 16:28:08 · 367 阅读 · 0 评论 -
算法 (十六)哈希表:设计实现RandomPool结构、布隆过滤器和一致性哈希
1、设计实现RandomPool结构【题目】 设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。getRandom(): 等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1)分析:用两个哈希表,同时存...原创 2019-03-06 13:18:09 · 450 阅读 · 0 评论 -
算法 (十五)二叉树:判断一颗二叉树是不是完全二叉树,并求这棵树的节点数
1、判断一颗二叉树是不是完全二叉树这里是判断二叉树是否是完全二叉树这里用到两个技巧:用queue来层级遍历每个节点的左右节点有四种情况:左空右空,左有右空,左空右有,左有右有用一个flag来开启叶节点检测其中如果左空右有,直接返回false,如果左空右空,左有右空(即右子节点为空),那么接下来的节点一定是叶节点(即没有左右子节点)代码如下:package cn.nupt;i...原创 2019-03-05 15:13:11 · 596 阅读 · 0 评论 -
算法 (十四)二叉树:判断一颗二叉树是不是平衡/搜索二叉树
1、判断一颗二叉树是不是平衡/搜索/完全二叉树平衡二叉树: 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。搜索二叉树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;判断是是否平衡二叉树:用递归,遍历每一个节点,...原创 2019-03-05 15:03:36 · 592 阅读 · 0 评论 -
算法 (十二)链表相关:判断两个链表是否相交,并返回交点
1、判断两个链表是否相交,并返回交点1.1 简单描述其实这是一个综合题,属于链表里面最难的了(好像面试管特别喜欢考这个),因为判断链表相交之前你需要先判断链表是否有环1.2 思路先判断两个链表是否有环(两种方法,辅助hashset或用快慢指针),找到入环点两个都无环,判断相交(两种方法,辅助hashse或计算链表长度差N然后长链表先走N步,然后一起走,相遇即为交点)两个都有环(一个有...原创 2019-02-20 17:14:36 · 327 阅读 · 0 评论 -
算法 (十三)二叉树:遍历二叉树(递归和非递归版)
1、遍历二叉树(递归和非递归版)原创 2019-03-05 13:04:18 · 269 阅读 · 0 评论 -
算法 (十一)链表相关:复制含有随机指针节点的链表
1、复制含有随机指针节点的链表1. 1 简单描述就是单链表的每一个节点不只有next,还多了个rand,指向其他的节点或者指向null1. 2 思路有两种方法,第一种是利用外部辅助–hashMap,你来一个我存一个,并且是键值对,逐个对应,然后输出的时候再建立复制链表的节点之间的关系,空间复杂度为O(N)第二种就是在源链表的每个节点后面插入我们要复制的节点,1 > 1_ >...原创 2019-02-19 21:54:24 · 172 阅读 · 0 评论 -
算法 (十)链表相关:将单向链表按某值划分成左边小、中间相等、右边大的形式
1、将单向链表按某值划分成左边小、中间相等、右边大的形式1.1 描述原创 2019-02-19 16:26:59 · 619 阅读 · 0 评论 -
算法 (九)链表相关:判断链表是不是不回文结构
1、判断链表是不是回文结构1.1 描述:回文就是123321或者12321,也就是正着反着读都一样1.2 思路:有点复杂,三个阶段难度,适合和面试官唠嗑第一种:需要N额外空间,也就是说要用一个辅助结构,这里是Stack就是把链表压入到栈中,然后用原来的链表和弹栈的链表逐个比对第二种:需要N/2额外空间,我们先用快慢指针找到中间节点,然后把后半部分压栈,然后再向上面一样弹栈做比较第三...原创 2019-02-18 22:51:02 · 163 阅读 · 0 评论 -
算法 (八)链表相关:反转单向链表、打印两个有序链表的公共部分
参考博文:理解单链表的反转(java实现)单链表反转的两种实现(Java)1、反转单向链表有两种方法,递归和遍历,具体实现过程请看上面俩个博文中的图表结合下面代码的注释代码实现:package cn.nupt;/** * @Description: 反转单向和双向链表 * * @author PizAn * @Email pizan@foxmail.com * @...原创 2019-02-18 22:44:01 · 274 阅读 · 0 评论 -
算法 (七)矩阵相关:螺旋打印矩阵、旋转正方形矩阵、之字形打印矩阵、在行列都排好序的矩阵中找数
1、螺旋打印矩阵要求:额外空间复杂度为O(1),只用变量,原地打印先确定左上点和右下点,先打出边框,然后向内调整点的位置,循环打印,如图所示:完整代码如下package cn.nupt;/** * @Description: 顺时针螺旋打印矩阵 * * @author PizAn * @date 2019年2月16日 下午10:01:39 * */public c...原创 2019-02-17 17:50:56 · 288 阅读 · 0 评论 -
算法 (二)递归相关算法的时间复杂度分析(master公式引入)、归并思路练习:小和问题和逆序对问题
1、递归相关算法的时间复杂度分析(master公式引入)一切递归行为都可以变成非递归行为,递归就是系统帮你压栈,子程序运行完之后弹栈,还原,继续往下执行在学排序算法的时候,首先学习的一定是选择、插入(希尔排序是插入排序的一种)、冒泡三个排序,这个三个排序的时间复杂度均为O(N^2),空间复杂度为O(1)(关于这几个算法,请看:选择排序、插入排序、希尔排序 、冒泡排序)对于涉及到递归的,如...原创 2019-01-22 12:23:49 · 289 阅读 · 0 评论 -
算法 (六)自定义栈获取栈元素最小值(getMin)、队列模拟栈、栈模拟队列
1、自定义栈获取栈元素最小值(getMin)1.1 简单描述自定义一个栈的元素,实现获得最小元素的方法:getMin1.2 思路:调用两个Java栈集合,一个数据栈dataStack,一个辅助栈helpStack压栈操作:同时压入,data栈正常压入,help栈:a:如果没有元素,就压入新元素b:如果有元素,小于help栈顶元素,就压入新元素c:如果大于或者等于help栈顶元素,...原创 2019-01-27 17:09:55 · 404 阅读 · 0 评论 -
算法 (一)时间复杂度的定义、对数器及其模板
1、时间复杂度的定义常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。如对比两个数、交换两个数时间复杂度:常数操作数量的指标,只要高阶项。评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间。举例:一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数组长度为N,B数组长度为M。(当因为...原创 2019-01-21 15:23:33 · 519 阅读 · 0 评论 -
算法 (五)数组模拟栈和队列
1、数组模拟栈和队列数组模拟栈挺简单的,弄一个指针index,压栈就index++,弹栈就 -- index数组模拟队列有点复杂,要弄三个指针,index、first和last,index防止越界(这里是固定数组,即用户需要给出栈和队列的初始大小),first和last模拟先进先出...原创 2019-01-25 21:46:45 · 378 阅读 · 0 评论 -
算法 (四)排序算法的稳定性及其总结、桶排序(计数排序、基数排序)
1、排序算法的稳定性及其总结对于数组中相同的数,在排序后还能不能保持相对位置不变,比如1112233344445,虽然是一样的,但是希望相对位置不要变冒泡排序稳定插入排序稳定选择排序不稳定归并排序稳定(先排左区,再排右区,可以做到稳定)快排不稳定(4443 — 3444)(也就是说parttion过程做不到小于一个数放左边,然后这些数相对次序还不变)堆排不稳定(44455,heap...原创 2019-01-25 13:16:30 · 3121 阅读 · 1 评论 -
算法 (十七)字符串:单词查找树(前缀树),实现添加、删除、搜索、统计前缀数目等功能
1、单词查找树(前缀树)又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 ----百度具体图文表述请看别的技术博客,这里我分别用数组和map来表...原创 2019-03-07 12:46:14 · 936 阅读 · 0 评论