数据结构和算法
数据结构和算法
菜瓜_牛顿
枪如惊雷,照一身肝胆
展开
-
栈和队列:滑动窗口和数组变树问题
1.滑动窗口问题有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。 以数组为[4,3,5,4,3,3,6,7],w=3为例。因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5。第四个窗口原创 2017-07-19 10:23:45 · 485 阅读 · 0 评论 -
动态规划6:台阶问题和矩阵最小路径问题
1.台阶问题有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。思路:动态规划问题也可以说是斐波那契数列。如果只有一个台阶f[1]=1,有两个台阶f[2]=2.public class GoUpsta原创 2017-07-18 11:05:02 · 848 阅读 · 0 评论 -
链表相关1
一、链表的分化题目:对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。 思路:该题目也可以将节点放到a[]数组中,进行类似于荷兰国旗问题的处理。这里给出原创 2017-07-14 08:59:08 · 304 阅读 · 0 评论 -
单链表删节点
题目:只给定链表中的节点node,不给头结点,如何在链表中删除node?实现这个函数,要求时间复杂度O(1)思路:该题当然是说单链表,如果双链表就很容易了。比如单链表 1->2->3->4->5...,现在只知道节点node=3,如何将其删除。把节点4的值拷贝到节点3,然后删除节点4(即node.next拷贝到node,然后删除node.next所对应的节点)该原创 2017-07-13 16:41:45 · 434 阅读 · 0 评论 -
环形有序链表插入节点
题目:将值为value的节点node插入有序环形链表中(头节点head)思路:分以下情况:(1)head==null,即链表为空,那么node.next=next,返回node。(2)链表不为空,pre=head,cur=head.next;两个同步向后找,直到pre(3)如果没找到(2),node要插入head前面,有两种情况:node>cur,node原创 2017-07-13 16:00:26 · 988 阅读 · 0 评论 -
排列组合问题
一、(1)6*9的方格,左上角起点,右下角终点,请问一共多少种走法?共走13步,5步向右8步向下。C513=C813=1287种public class Robot { public int countWays(int x, int y) { //总共有x+y-2步,其中向右x-1次,向下y-1次 // write code here原创 2017-07-12 19:10:20 · 491 阅读 · 0 评论 -
快速幂算法及其拓展
快速幂算法问题引入:求an(a,n∈N+) 朴素算法:令ans初始值为1,乘n次a得到an 朴素算法时间复杂度:O(n)问题:如果n非常大,比如高达1015,怎么办? 思考:朴素算法哪里可以优化?朴素算法的特点是,连乘过程中底数始终为a,这很不聪明。考虑下例: a=2,n=15 我们没有必要乘15次2,注意到15=23+22+21+20,不妨将215拆分原创 2017-07-23 21:10:45 · 402 阅读 · 0 评论 -
位运算相关题目
位运算:& | 按位异或^ 取反~左移右侧补0相当*2: >右移左侧补00:>>> 相关问题:布隆过滤器(1)不安全网页的黑名单里有100亿个数据,每一个网页的URL最多占用64B。要求实现一种过滤系统,可以根据网页的URL判断是否在这个黑名单中。系统允许有万分之一的失误率。且额外的空间不能超过30GB。首先100亿个URL共占 64 * 10 ^10bit 约为原创 2017-07-12 11:45:01 · 499 阅读 · 0 评论 -
栈和队列相关题目
一、栈和队列(1)优先级队列:根据元素优先级决定弹出顺序,它的数据结构为堆结构(按照优先级,形成最大堆或者最小堆),并不是线性表结构。(2)深度优先遍历DFS---栈实现,广度优先队列BFS--队列实现 二、题目(1)定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。public class Solution { Sta原创 2017-07-10 17:44:50 · 348 阅读 · 0 评论 -
平衡二叉树AVL
AVL:(1)空树是平衡二叉树(2)所有子树的左右子树的高度差不超过1(1):判断是否为平衡二叉树:public class CheckBalance { public boolean check(TreeNode root) { // write code here if(root==null ) return true;原创 2017-07-16 19:48:24 · 235 阅读 · 0 评论 -
几种基本排序算法的实现
package test.sort;import org.junit.Test;/** @Author lingl @Date 2020/4/16 */public class SortTest { @Test public void test() { int[] array = new int[] {5, 3, 4, 1, 3, 6, 2}; quickSo...原创 2020-04-16 15:38:26 · 231 阅读 · 0 评论 -
*跳跃链表SkipList
结构每层都对应一个有序的列表 上一层的列表元素集合是下一层的子集 头尾有个边界操作插入,删除,查找时间复杂度是O(logn),优于链表O(n)查找:从最顶层的链表开始查找,如果小于则顺着链表往后查,否则移动到下一层开始查找。 插入:首先最底层肯定是要插入元素的,但s1层是否要插入是依照概率函数来判断的,这里是纯概率的,即非严格的平衡。 删除:同插入类似应用Redis...原创 2020-04-07 14:40:24 · 204 阅读 · 0 评论 -
排序--4.堆排序(灰常重要滴)
1.原地排序,不稳定的,时间复杂度为O(logn) logn为堆的高度;在任何时候数组中只有常数个元素存储在输入数组之外’2.值得注意的是:当数组下标从1开始,即(1时,节点 i 的左孩子为 2i,右孩子为 2i+1(右孩子不一定有),i 的父亲为 i/2,最后一个父亲节点为 n/2当数组下标从0开始,即(0时,节点 i 的左孩子为 2i+1,右孩子为 2i+2(右孩子不一定有原创 2017-03-08 17:41:45 · 777 阅读 · 0 评论 -
排序算法总结
排序总结2、经典算法时间复杂度O(1) 快排的最坏情况:初始是逆序的,时间复杂度为n^2,最好情况每次选择的轴心最均匀,为logn3、空间复杂度:O(1):插入 选择 冒泡 希尔 堆排序O(logN)~O(N):快排。快排这种算法需要栈的支持,栈的大小logn~n,所以最坏情况下为O(logn)~O(n)。每次递归传入参数left、right,平均递归次原创 2017-07-05 10:41:57 · 356 阅读 · 0 评论 -
桶排序
排序算法总结: 时间空间稳定其他冒泡O(n^2)原地稳定进行n-1次扫描,相邻两个数进行比较,这样第一轮扫描结束后,最大的在最后面;第i次扫描进行n-i次比较;(i=0;i(j=0;ja[j+1] 交换选择O(n^2)原创 2017-07-04 09:59:38 · 218 阅读 · 0 评论 -
排序--2.希尔
1.原地排序,不稳定的,时间复杂度O(n^1.3)小于n的整数d1作为增量,把文件全部分成d1组,所有距离为d1的为一组,组内插入排序,d2例如初始:49, 38, 65, 97 ,76, 13, 27, 49A, 55, 04第一趟d1=5: 49 13 3827 65 4997 55 76 04 分成5组 组内插入排序得到结果: 13,27,49A,55,04原创 2017-03-06 21:54:06 · 371 阅读 · 0 评论 -
排序--5.快排
1.原地排序,不稳定的,时间复杂度O(nlogn),尽管最坏情况下是n^2,即每次选的partition都是边界值,但这种情况几乎不会发生。 思想:数据x前边的都比它小,后边的都比它大2.快排中调用的partition函数 可以有多种选择形式,意在选出一个较好的轴心x。此处列出选用尾节点a[right]作为轴心,如果随机选取只要将其与a[right]交换位置,再调用该partiti原创 2017-03-09 13:28:34 · 304 阅读 · 0 评论 -
动态规划8:最优编辑str1-->str2
题目:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。样例:"abc",3,"adc",3,5,3,100返回:8思原创 2017-07-19 08:35:06 · 531 阅读 · 0 评论 -
排序--3.选择
1,不稳定,原地排序,时间复杂度O(n^2)2.一个记录最多只进行一次交换就能到达它的位置;从头开始(i=1,i原创 2017-03-06 22:31:35 · 234 阅读 · 0 评论 -
树--.遍历
1.先中后层次遍历时间复杂度均为O(n)先序遍历(根-->左子树-->右子树)12-9-76-35-22-16-48-46-40-90-中序遍历(左子树-->跟-->右子树)9--12--16--22--35--40--46--48--76--90--后序遍历(左子树-->右子树-->根)9---16---22---40---46---48---35---90---76---1原创 2017-03-07 11:50:04 · 427 阅读 · 1 评论 -
动态规划5:找零钱问题
题目:有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。样例:[1,2,4],3,3 返回:2(即1 1 1,1 2)思原创 2017-07-18 10:35:52 · 6924 阅读 · 0 评论 -
动态规划7:最长上升子序列LIS
题目:这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。样例:[1,4,2,5,3],5返回:3思路:从前向后求出以index为终点的序列的最长递增子序列长度:注意子序列并不要求连续,即子序列不等于连续子序列。例如1,4,2,5,3原创 2017-07-18 14:59:34 · 398 阅读 · 0 评论 -
动态规划--3.最长公共子序列LCS和最长公共子字符串
1.LCS:序列X{x1,x2,x3...xm}和序列Y{y1,y2...yn}找到两个序列的最长公共子序列是指X中的某些元素按照先后顺序出现在Y中,比如x1和x2出现在Y中,一定要x1在前x2在后,但二者可以不连续。 再比如BDCABA 和 ABCBDAB,字符串 BCBA 和 BDAB 都是是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子序列。2.理解题意后我们设C[i,j原创 2017-03-11 21:41:14 · 504 阅读 · 0 评论 -
动态规划--1基本知识点+01背包
1. 动态规划主要用在求解最优化问题上,与分治法类似,都是将原问题分解成多个子问题,递归求解子问题,在合并计算出最优解的过程。但是二者还是有区别的,主要区别:(1)动态规划分解的子问题多是有互相联系性的,经分解的子问题往往不是彼此独立的;(2)动态规划对每个子问题只求解一次,将结果保存到表中(动态规划具有多种格式,但它们具有相同的填表格式)从而避免了当子问题再次出现过程中重复求解,节省时间原创 2017-03-10 21:31:09 · 546 阅读 · 0 评论 -
动态规划0-1背包
1.(1)动态规划将问题划分成子问题,在合并的结果。子问题是彼此独立的。(2)动态规划将已计算过的子问题结果保存到表中,是一种以空间换时间的方式。(3)动态规划的初始化条件注意,不要写错。找出递归函数关系式(4)与记忆搜索相比,动态规划的计算具有一定的顺序性,比如b的结果依赖a的结果,要先a在b,而记忆搜索哪个先来就先计算哪个,将其结果保存即可。2、常见的动态规原创 2017-07-18 16:01:49 · 432 阅读 · 0 评论 -
动态规划9:变态跳台问题
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:分析可知:如果要上n阶台阶,拥有的可能方法数目是:f(n)=f(n-1)+f(n-2)+f(n-3)+……f(1)+f(0);于是从前往后计算出各个项的值就可以,在简单台阶问题中需要保留2个计算结果供后面的计算使用,这里需要保原创 2017-07-19 08:37:37 · 372 阅读 · 0 评论 -
B- 和 B+树
B树:http://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190965&idx=1&sn=53f78fa037386f85531832cd5322d2a0&chksm=8c9909efbbee80f90512f0c36356c31cc74c388c46388dc2317d43c8f8597298f233ca9c29e9&mpshar原创 2017-08-17 15:01:54 · 511 阅读 · 0 评论 -
查找
1.顺序查找(不多说明,表尾设个标兵)2.二分查找(有序表)最少经过1次查找成功,最多经过logn次比较。二分查找仍是线性表,若经常插入删除,则元素排序费时,所以比较适合已经建立就很少改动的又经常查找的线性表。3.分块查找(索引顺序查找)块内不排序,块间排序(第一个块内所有关键字都小于第二个块内任意关键字)选择每个块中最大值(或者最小值)关键字组成索引表。先二分原创 2017-03-06 16:52:18 · 226 阅读 · 0 评论 -
字符串匹配---KMP
kmp算法:给定两个字符串O和f,长度为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。kmp算法思想在字符串O中寻找f,当匹配到位置i时两个字符串不相等,将字符串f向前移动。常规是每次向前移动1位,但它没有考虑前i-1位原创 2017-07-03 10:01:49 · 207 阅读 · 0 评论 -
线性表3-双链表
双链表的每个节点包含三个部分:该节点的数据域,节点的直接前驱,节点的直接后继。插入:不管是在节点p前插入新节点s,还是在p节点后插入节点s,这里有个比较容易记和理解的地方:不管是哪种操作,都后处理p.prior和p.next就对了。解释下,如果在p之前插入节点s,首先要做的部分是s.prior=p.prior, s.next=p而后是p.prior.next=s p.prior=原创 2016-07-25 21:41:30 · 445 阅读 · 1 评论 -
树--1.基本知识
1.在计算机中树采用多重链表存储(定长型 不定长型)2.满二叉树:深度为h,含有2^h -1个结点,下图为完全二叉树.3.二叉树性质:(1)第i层至多有2^(i-1)个结点 (2)深度为h的最多含有2^h -1个结点(满二叉树) (3)一颗二叉树有n0个叶节点,n2个度数为2的节点,则n0=n2+1 (4)完全二叉树深度|logn| +1 (5)4.树原创 2017-03-07 09:18:05 · 327 阅读 · 0 评论 -
最短路径---Floyd
图片来自他人原创 2017-03-20 13:41:12 · 204 阅读 · 0 评论 -
顶点对之间的最短路径---Floyd
单源最短路径引出相关问题顶点对之间的最短路径问题,对于有向图G的任意一组顶点对 v1,v2找出v1到v2的最短距离和v2到v1的最短路径。其中一种方案是对每一个顶点调用一次Dijkstra算法,时间复杂度为O(n^3),另外一种就是Floyd算法 Floyd是一种动态规划思想,距离Ak[i][j]表示第k次计算是点 i 到点 j的最短距离,那么A0[i][j]就是初始时 i->j的原创 2017-03-20 13:38:22 · 974 阅读 · 0 评论 -
最小生成树
1.最小生成树(1)使图保持连通特性的最小代价(2)应用:顶点表示城市,边表示两个城市之间的通信线路,n个城市之间最多n(n-1)/2条线路,把n个城市连接起来至少需要n-1条,则最小生成树表示建立通信的最佳方案再如:电子元器件管脚相连,找出连线最少的方案2.prim算法和kruskal算法这两种方案使用普通二叉堆的情况下,很容易达到O(ElogV)的时间复杂度。通过斐波那契堆原创 2017-03-16 22:06:34 · 448 阅读 · 0 评论 -
单源最短路径---BellmanFord,Dijkstra
1.最短路径相关问题(1)单源最短路径:顶点s0到各个点的最短路径(2)单终点最短路径:各个点到终点s的最短路径(3)单对顶点的最短路径问题:点v到点u的最短路径(4)每对顶点间的最短路径:对于每对顶点u v找出,u v的最短路径(5)最短路径的最优子结构:Dijkstra算法属于贪心思想和Floyd算法属于动态规划2.相关说明(1)图中可以存在负值的权值,但是不能存在原创 2017-03-19 16:44:05 · 784 阅读 · 0 评论 -
排序---1.插入
1.理解成扑克抓牌过程,原地排序,稳定的,复杂度为O(n^2) insert-sort(A)for jdo keyi= j-1while i>0&&A[i]>keydo A[i+1]=A[i]i=i-1A[i+1]=key2.线性插入排序和折半插入排序以上为线性插入排序,折半插入虽然比较的次数比线性少,但是依旧是两层循环,时间复杂度也是O(n^2)原创 2017-03-06 17:43:52 · 197 阅读 · 0 评论 -
hash表
1. 数组:存储属于逻辑连续物理也连续的,随机存取快,二分查找复杂度为O(1),寻址容易,插入和删除困难。链表(非顺序表):逻辑连续,物理上可以不连续,存储区间可以是离散的,寻址难,插入删除快。2. 哈希表:将节点的关键字key作为自变量经过hash函数得到哈希值,进一步得到存储位置的线性表。哈希函数:除余法(m取小于存储区容量的素数);平方取中法(关键字先平方,再取中间某几位作为原创 2017-03-06 09:10:27 · 317 阅读 · 0 评论 -
树---2.哈夫曼树
1.哈夫曼树(最优树):带权路径最短的树,在信息检索中很有用。(贪心算法)路径为0结点至多1个,路径为1的节点至多2个,路径为k的节点至多2^k个。2.哈夫曼算法:(1)n个权值为{W1,w2,,,wn}构成n棵二叉树集合{F1,F2...Fn};(2)选权值最小的两颗二叉树构成一颗新二叉树,更新新二叉树的权值。(3)重复23.哈夫曼树应用(1)判定问题:成绩ABCDE各个等级原创 2017-03-08 09:55:02 · 322 阅读 · 0 评论 -
栈3-算数表达式求值
算术表达式计算,依靠两个栈:操作数栈p1和运算符栈p2。对于输入的String,从左到右读如每个字符c:(1)c为操作数,则入栈p1.push(c)(2)c为操作数,如果优先级c>top(top为运算符栈的栈顶元素,eg:c为*,top为+)则p2.push(c),继续读下一个字符 如果c为‘(’,p2.push(c)原创 2016-07-31 15:32:55 · 556 阅读 · 0 评论 -
栈2--链栈
栈的链式存储:top为链表的第一个结点,当top=null时,链表为空栈。原创 2016-07-27 16:21:19 · 214 阅读 · 0 评论