
算法
xsinx
这个作者很懒,什么都没留下…
展开
-
栈排序---LintCode229
样例输入:1 3 2 10样例输出:10 3 2 1要求:不能使用栈以外的其他数据结构public Stack<Integer> StackSort(Stack<Integer> s1){ if(s1.isEmpty()) return s1; Stack<Integer> s2=new Stack<>(); ...原创 2019-12-01 09:22:20 · 169 阅读 · 0 评论 -
位运算
主要的问题是与、异或再配合着左移和右移操作1.(num>>i)&1:只出现一次的数字(L137)、汉明距离(L461)、只出现一次的数字 II(L137)、颠倒二进制位(L190)2.n&(-n):取出最后一位1及其后面的0对应的十进制,2的幂(L231)3.n&(n-1):将最后一个1置0, 位1的个数(L191)4.<<与>>...原创 2019-11-02 21:42:13 · 103 阅读 · 0 评论 -
Hash
一.哈希索引※A.为什么要引进动态hash?理想状态下,查找、删除、插入仅需要一次IO,但如果某个桶后的溢出块过多的话就会影响查找效率,所以尽可能每个桶仅有一个溢出块B.动态hash和静态hash的区别?动态hash桶的数量是可变的,静态hash桶的数量是不可变的C.动态hash的分类?可扩展Hash、线性HashD.两种动态hash都是怎样实现动态变化的?可扩展hash:桶的数量每...原创 2019-10-30 15:57:17 · 207 阅读 · 0 评论 -
搜索
1.DFS与BFSA.DFS应用的是栈,不论是系统栈还是自己写的栈;BFS用的是队列B.DFS的空间复杂度是O(h),BFS的空间复杂度是O(2^h)C.BFS用于求最短步数等,DFS用于求庞大状态中满足要求的特定解...原创 2019-09-04 18:26:13 · 86 阅读 · 0 评论 -
回文
原创 2019-08-31 15:50:59 · 95 阅读 · 0 评论 -
for的小知识点
不论如何都会将整个数组遍历完for(int i=0;i<arr.length;i++) if(check()) {}可能在中途就停for(int i=0;i<arr.length && check();i++){}原创 2019-08-26 11:11:57 · 156 阅读 · 0 评论 -
蛇形打印问题
1.二叉树的打印—AcWing 452.字符串的打印—LeetCode 6原创 2019-08-25 08:30:28 · 144 阅读 · 1 评论 -
树
原创 2019-08-21 16:06:26 · 91 阅读 · 0 评论 -
背包问题
一.01背包1.如何理解两重for循环中的部分? for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) { f[i][j]=f[i-1][j]; if(j>=v[i]) f[i][j]=Math.max(f[i][j],f[i-1][j-v[i]]+w[i]); }...原创 2019-08-07 21:04:00 · 103 阅读 · 0 评论 -
数学问题
一.判断是否是质数 public static void isPrime(int x) { if(x<2)//小于2的必定不是质数 { System.out.println("No"); return; } for(int i=2;i<=x/i;i++) if(x%i==0) ...原创 2019-08-06 21:00:17 · 112 阅读 · 0 评论 -
二分图
一.判断是否是二分图1.二分图<=>图中无奇环(边数为奇数),所以就可以利用染色法2.染色法的时间复杂度是O(m+n),最坏情况是把所有的点和边均遍历一遍二.判断二分图中联通的数量1.理解为什么会设立st[]用来存储是否被访问过若遍历到x3:x3->y1->x1->y2->x2->y1,若不标记y1,那么会一直循环访问...原创 2019-08-06 19:41:35 · 82 阅读 · 0 评论 -
最小生成树
一.prim1.由于prim的时间复杂度为O(n^2),多用于稠密图2.prim和dijkstra最大区别在于prim是到[集合]的距离,dijkstra是[单源点]的距离二.kruskal1.kruskal的时间复杂度为O(mlogm),多用于稀疏图,mlogm是排序的时间,求边的距离和的时间是m2.kruskal要找的是不在集合中且边权最小的A.边权最小通过排序来实现B.不在集...原创 2019-08-06 15:38:55 · 91 阅读 · 0 评论 -
最短路径
1.朴素dijkstra:适用于稠密图(m>n^2),边的个数大于节点个数的平方2.堆优化版的Dijkstra:A.适用于稀疏图(m<n^2)B.怎样实现的优化?原创 2019-08-03 11:38:49 · 102 阅读 · 0 评论 -
栈和队列
Template.Stack.javaTemplate.Queue.java原创 2019-07-29 15:36:40 · 86 阅读 · 0 评论 -
堆
1.堆仅有两个操作:down(heapify) 和up(heapInsert),剩下的操作都是基于这两个操作演化原创 2019-07-26 15:45:46 · 97 阅读 · 0 评论 -
并查集
一.常见问题:????并查集必须一次性给出所有数据,而不能流式输入1.并查集是解决什么问题的?①判断两个节点是否属于一个集合②快速将两个节点所在的节点合并2.并查集的本质是什么?多叉树3.为什么要将并查集扁平化判两个节点是否属于同一集合或快速合并集合,都需要找到根节点,太浪费时间。扁平化可以降低时间复杂度4.单次查询和合并的时间复杂度未O(1)5.并查集应用:A.合并:朋友圈/岛问题...原创 2019-07-25 06:28:29 · 126 阅读 · 0 评论 -
排序
Template.sort.java1.归并排序原创 2019-07-23 09:20:00 · 113 阅读 · 0 评论 -
KMP
1.求NEXTS数组原创 2019-07-22 08:56:45 · 89 阅读 · 0 评论 -
二分
二分模板一共有两个,分别适用于不同情况。算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。划分成[l,mid]还是[l,mid-1]的依据是:如果if (check(mid)) 条件成立,首先考虑一下答案在左区间还是右区间,如果答案在左区间并且mid也可能是答案,那么就要按[l, mid], [mid + 1, r]来划分;如果答案在右...原创 2019-07-09 08:44:35 · 171 阅读 · 0 评论 -
排序算法稳定性的解析
1.冒泡排序怎样实现稳定排序在进行if判断时,严格的大于号(小于号)即可2.直接插入排序怎样实现稳定排序?同冒泡3.为什么选择排序不能实现稳定排序?例:arr=[4,4,4,0,3,2],第一趟找到0的下标和arr[0]进行交换,那么数字4的稳定性就被破坏掉了4.为什么快速排序不能实现稳定排序?例:arr=[4-1,4-2,4-3,3],排序后的结果是[3,4-2,4-3,4-1],...原创 2019-06-01 11:30:01 · 167 阅读 · 0 评论 -
递归时间复杂度分析
T(N)=a*T(N/b)+T(N^d)N是父问题的规模,a是执行次数,N/b是父问题被分割的规模,N^d是后续问题的规模注意:划分子问题的规模要一致①log(b,a)>d–>时间复杂度N^log(b,a)②log(b,a)=d–>时间复杂度N^d*logN③log(b,a)时间复杂度N^d下面举个例子T(N)=2T(N/2)+T(N)将问题分成两部分,每部分...原创 2019-05-29 21:13:29 · 164 阅读 · 0 评论