算法讲堂
2112222222222
这个作者很懒,什么都没留下…
展开
-
左神算法讲堂笔记 05 树
1、非递归遍历树 非递归遍历有点难,目前只能读懂代码,里面的精髓还未真正参透。 先序遍历:不断地把根入栈,再取出来输出 根左右, 那么先入栈的肯定是根,要保证输出左子树,再输出右子树,那么就要先入栈右子树。 void preOrderUnRecur(Node head) { System.out.println("先序 根 左 右: "); if (head != ...原创 2019-02-21 14:57:01 · 184 阅读 · 0 评论 -
左神算法讲堂笔记 09 由递归到动态规划
一、 有n个人希望把黄金分隔成 {a1,a2,a3,a4}, 希望代价最小。 代价是这么算的,例如长度是 7 ,分割成 3 4, 那么代价是7 。 逆向思维、哈夫曼编码 一开始的想法是,排序,每次切下来最大的。 但是 2 2 2 2 3 3 3 3 这种情况就pass了。 最后的做法是类似哈夫曼编码, 每次找出两个最小的, 合并,合并之后的点再加进去集合。 二、 有n个项目,对于第i个项目,需要花...原创 2019-02-28 13:16:12 · 985 阅读 · 3 评论 -
左神算法讲堂笔记 06 Hash算法
1、哈希函数和哈希表 当通过put方法存入对象时,会调用key对象的hashCode()方法计算出hashcode,通过hashcode找到bucket位置保存entry对象。获取对象时,通过key计算出hashcode,找到bucket位置,HashMap采用链表解决碰撞,因此遇到冲突时,就访问bucket位置上链表的每个点,直到key对象的equals()相等。 jdk1.8后,当链表长度大于...原创 2019-02-24 18:28:19 · 327 阅读 · 0 评论 -
左神算法讲堂笔记 07并查集和前缀树
岛 只分析多线程下如何优化。 假设把矩阵分成两块,交给两个线程去处理。那么各自跑完会在地图上标注**当前的1属于哪个中心点(多线程间全局变量可以使用volatile关键字) 先站在左边一方的角度考虑,只需要把边界上的1,即图上的A位置。接着向右边进行询问,由于右边的格子上是1,那么就把AC进行合并(使用并查集进行优化),岛的数量-1。 下一次遇到AC的时候,并查集查询到属于同一个集合,那么就不...原创 2019-02-25 15:47:26 · 684 阅读 · 0 评论 -
左神算法讲堂笔记 04 宏观调控和链表
1、绕圈打印矩阵 public ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> list = new ArrayList<&am原创 2019-02-20 10:48:11 · 168 阅读 · 0 评论 -
左神算法讲堂笔记 01 归并排序和应用 --- 小和问题、逆序数
1、master公式求递归的时间复杂度 T(N) = a*T(N/b) + O(N^d) log(b,a) > d -> 复杂度为O(N^log(b,a)) log(b,a) = d -> 复杂度为O(N^d * logN) log(b,a) < d -> 复杂度为O(N^d) 2、归并排序(合并的时候原创 2019-02-20 10:50:19 · 514 阅读 · 0 评论 -
左神算法讲堂笔记 02 快排、堆排、桶排
1、荷兰国旗问题(快排的前导) 题意:把数组分成左边小于num,右边大于num,中间等于num,不需要有序 解法: 假设区间为[L , R] 维护一个左边小于区间,[L - less] ,维护一个右边大于区间 [more - R], 设当前下标为cur,不断把arr[ cur ]交换到左区间或者右区间即可。 这里的while写的很巧妙,每次只针对cur进行判断,把后面的换过来之后,cur不动,下一...原创 2019-02-20 10:52:03 · 417 阅读 · 0 评论 -
左神算法讲堂笔记 03 栈的应用
1、栈 1.1 栈的拓展应用 案例1 求栈最小值 一个数组序列,不断压栈,可以询问栈内最小值,且push、pop、peek、query(找最小)都是o(1)。 解法;维护本身栈的同时,维护一个min栈,当前数小于min栈栈顶,那么就插入min栈顶。 否则再插入一个min栈栈顶元素。 案例2 使用栈得到队列结构 维护push 和 pop 两个栈。插入的话就放到push栈。 pop时,假设pop栈为...原创 2019-02-20 10:53:12 · 167 阅读 · 0 评论