Algorithm
-
959. 由斜杠划分区域 使用并查集,不断加边,判断是否产生环,每产生一个,res++需要先对所有的顶点编号,然后根据
grid[i][j]
的值来生成对应的edge,并判断join是否成功,失败的话就说明产生了环; (后面讲的自己画个图) 顶点编号:N*N的网格,编号是1~(N+1)^2,最初 所有直角边上的点 属于一个图。如果grid[i][j]
所在方格的四个顶点编号,从左上顶点顺时针:i*(N+1)+j+1, i*(N+1)+j+2, (i+1)*(N+1)+j+2,(i+1)*(N+1)+j+1
因此 如果grid[i][j] = '/'
,则产生的边为i*(N+1)+j+2, (i+1)*(N+1)+j+1
,grid[i][j] = '\'
, 产生的边为i*(N+1)+j+1,(i+1)*(N+1)+j+2
-
1584. 连接所有点的最小费用 最小生成树算法,Kruskal算法和prim算法均可解,这里练习kruskal , 1. 先将所有点放入vector中,只保留指针 2. 先枚举所有不重复的边形成vector。3. 将边按照从小到大顺序排列。4.遍历所有边,如果边中的两个点不属于同一个连通图,则加入边集合。 kruskal算法效率没优化是很低的,这个由于是稠密图,比较适合prim算法。顺便说下prim+堆实现的算法:1. 先将所有点放入vector中,只保留指针 2. 枚举所有边,这里需要构建邻接表,由于是二维的点,使用map<point* ,edge *>存储下。3. 任意选择一个起点,将其加入新图中,这里只需要标记为访问过就可以。加入过程中,将该点能到达的边加入堆中。4. 从堆中选择最短边,并且其中有一端不在新图中,则将这个点以及对应的边加入新图。
-
645. 错误的集合 类似 448. 找到所有数组中消失的数字 ,将所有元素交换到它应该在的下标位置,最后有些下标放的值不等于index+1,则index+1就是缺失的。而num[index]就是重复的。
-
382. 链表随机节点 398. 随机数索引 均是水塘抽样法中,k=1的情况去解。水塘抽样法请参考我写的这篇文章
Review
What-is-the-major-difference-between-the-buffer-cache-and-the-page-cache buffer cache与page cache有什么区别,buffer cache主要是用于磁盘的block IO,page cache是文件IO,本来这两个cache是独立的,这样数据可能被cache两次。在linux kernel2.4 以后,buffer cache指向了page cache(如果数据已经有page cache的话)。
Tips
- linux vim 粘贴代码会出现持续缩进,解决办法:
粘贴前使用: set paste
,然后再粘贴
粘贴后使用: set nopaste
取消