0%

BFS

图的BFS

1162. 地图分析

对于图的BFS也是一样滴~ 与Tree的BFS区别如下:
1、tree只有1个root,而图可以有多个源点,所以首先需要把多个源点都入队。
2、tree是有向的因此不需要标志是否访问过,而对于无向图来说,必须得标志是否访问过!
并且为了防止某个节点多次入队,需要在入队之前就将其设置成已访问!

作者:sweetiee
链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible/solution/jian-dan-java-miao-dong-tu-de-bfs-by-sweetiee/

BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {

public int maxDistance(int[][] grid) {
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};

Queue<int[]> queue = new ArrayDeque<>();
int m = grid.length, n = grid[0].length;
// 先把所有的陆地都入队。
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
queue.offer(new int[] {i, j});
}
}
}

// 从各个陆地开始,一圈一圈的遍历海洋,最后遍历到的海洋就是离陆地最远的海洋。
boolean hasOcean = false;
int[] point = null;
while (!queue.isEmpty()) {
point = queue.poll();
int x = point[0], y = point[1];
// 取出队列的元素,将其四周的海洋入队。
for (int i = 0; i < 4; i++) {
int newX = x + dx[i];
int newY = y + dy[i];
if (newX < 0 || newX >= m || newY < 0 || newY >= n || grid[newX][newY] != 0) {
continue;
}
grid[newX][newY] = grid[x][y] + 1; // 这里我直接修改了原数组,因此就不需要额外的数组来标志是否访问
hasOcean = true;
queue.offer(new int[] {newX, newY});
}
}

// 没有陆地或者没有海洋,返回-1。
if (point == null || !hasOcean) {
return -1;
}

// 返回最后一次遍历到的海洋的距离。
return grid[point[0]][point[1]] - 1;

}
}

BFS遍历矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int rows = matrix.length, columns = matrix[0].length;
boolean[][] visited = new boolean[rows][columns];
int total = rows * columns;
int[] order = new int[total];
int row = 0, column = 0;
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
}

参考目录

BS Mind

排除法找二分

边界收缩问题

限制条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int binarySearch(int[] array, int des) {
int low = 0, high = array.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;//int mid = (left + right) >> 1;
if (des == array[mid]) {
return mid;
} else if (des < array[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution {

public int mySqrt(int x) {
if (x == 0) {
return 0;
}
// 注意:针对特殊测试用例,例如 2147395599
// 要把搜索的范围设置成长整型
long left = 1;
long right = x / 2;
while (left < right) {
// 注意:这里一定取右中位数,如果取左中位数,代码会进入死循环
// long mid = left + (right - left + 1) / 2;
long mid = (left + right + 1) >>> 1;
long square = mid * mid;
if (square > x) {
right = mid - 1;
} else {
left = mid;
}
}
// 因为一定存在,因此无需后处理
return (int) left;
}

}

二分查找

Binary Search Solution in Leetcode

二分查找细节详解_labuladong

大四上學期的成績單

1082.png

後面再補內容,已經錯過實習和秋招了。現在抓緊搞搞春招。

學校的課實在太多,30學分忙8過來

回家以后发现钙hub也打不开了…..除了科学上网的解决方法,另外一种就是设置静态IP地址

图床也加载不出来了,这里推荐SM SM的图床服务

新年新FLAG

专业技术

  • 按照zuochengyun大哥的建议读JDK重要包的源代码,
    java.lang,java.util.java.io
  • Spring源码,

  • 学习分布式缓存技术.

  • PASS THE FRM Certification RANK1

语言水平

  • 日语达到N3水平

如何自学备考日语N3?

  • TOEFL破百

📚书单

  • Thinking In Java

    Bruce Eckel 的《Java 编程思想》(Thinking in Java),非常有名的经典书籍。这本书的特点是,不仅仅介绍 Java 编程的基础知识点,也会思考编程中的各种选择与判断,包括穿插设计模式的使用,作者从理论到实践意义从不同的角度进行探讨,构建稳固的 Java 编程知识体系。

    img

  • Effective Java

    这本书的英文第三版已经在国内上市,涵盖了 Java 7 到 Java 9 的各种新特性。严格来说,这本书不算是一本基础书籍,但当你有一定基础后,还是非常建议通读一下的。关于这本书的阅读,我的建议是边学习边回顾,在吸收书中的经验时,多去想想自己在实际应用中是如何处理的。虽然《Effective Java》的具体章节可能是从某个点出发,但可以说都是对 Java、JVM、面向对象等各种知识的综合运用,对于设计和实现高质量的代码很有帮助。

    img

  • Java 并发编程实战

    作者全是响当当的人物,比如 Brian Goetz,我多次在专栏里引用他的观点,众多强力作者也保证了书的质量。抛开作者光环,这本书的内容全部建立在理论之上,先讲清道理再谈实践,可以真正让你知其然也知其所以然。这本书更加侧重并发编程中有哪些问题,如何来深刻地理解和定义问题,如何利用可靠的手段指导工程实践,并没有过分纠结于并发类库的源码层面。

    img

  • 深入理解 Java 虚拟机

    img

  • 性能优化

    性能优化,我推荐 Charlie Hunt 和 Binu John 所著的《Java 性能优化权威指南》(Java Performance),也是我上次在直播时向大家推荐的。Java 之父 James Gosling。

    img

  • Spring实战

    可以说 Spring 等相关框架已经成为业务开发的事实标准,系统性地掌握 Spring 框架的设计和实践,是必需的技能之一。

    img

  • Netty实战

    Netty 在性能、可扩展性等方面的突出表现,已经得到充分验证,作为基础的通信框架,已经广泛应用在各种互联网架构、游戏等领域,甚至可以说,如果没有仔细分析过 Netty,对 NIO 等方面的理解很可能还在很肤浅的阶段。

    img

  • Cloud Native Java

    Java 应用程序架构处于飞快的演进之中,微服务等新的架构应用越来越广泛,即使未必是使用 Spring Boot、Spring Cloud 等框架,但是系统的学习其设计思想和实践技术,绝对是有必要的。当然如果你在实践中使用 Dubbo 等框架,也可以选择相关书籍。前沿领域的变化非常快,很多风靡一时的开源软件,在实践中逐渐被证明存在各种弊端,或者厂商停止维护。所以这部分的学习,我建议不要盲目追新,最好是关注于分布式设计中的问题和解决的思路,做到触类旁通,并且注重书籍之外的学习渠道。下面两本并不算是 Java 书籍,但 Java 程序员进阶少不了对互联网主流架构的学习,了解分布式架构、缓存、消息中间件等令人眼花缭乱的技术,对于有志于成为架构师的 Java 工程师来说非常有帮助。

    img

  • 大型分布式网站架构设计与实践

    这本书总结了作者在构建安全、可稳定性、高扩展性、高并发的分布式网站方面的心得。

    img

  • 深入分布式缓存:从原理到实战

    这本书融合了原理、架构和一线互联网公司的案例实践,值得参考。

    img

为什么我们要了解JVM

FULLGC.jpg

JVM.png

私有线程区域:

  • 栈:函数当前运行过程中的一些函数变量。存对象的引用类型和地址
  • 本地方法栈:存放C++运行时的native栈。
  • 程序计数器:指向当前程序运行的位置。

    线程共享区域:

  • 堆:存对象(最终),老年代。
  • 方法区:存储元数据信息,在JDK1.7前作永久代,1.8以后改为元数据空间,存储静态变量和常量、类加载器。

Java的基础数据和指针都是值类型,所以直接存到内存里面去,不是去存地址寻址。

GC

  • GC Root本地方法栈,方法区,栈不能被删除

    删除方法

    • 标记清理,==会产生内存碎片==。
    • 标记整理(删了后面的顶上来,减少内存碎片),==前移空间移动代价太大==。
    • 复制算法(分为两个区),不直接删除,不被删除的复制到新区,==需要2倍的内存==。

实际:

Minor GC当在 Eden 区分配内存不足时,则会发生 minorGC ,由于 Java 对象多数是朝生夕灭的特性,所以 minorGC通常会比较频繁,效率也比较高。
  • 年轻代:E区(伊甸园,满了触发YoungGC,用复制算法),,两个Survive区(S0.S1) 8:1:1,两个S区交替工作(E+S1到S0,E+S0到S1)。每次Young GC完年龄会加一,满15岁就直接都去老年代区了。ParNew垃圾收集器(复制)。
    Full GC
  • 老年代:只有一块,存满15岁到去老年代区的对象。和大对象,Old满了就和年轻的一起Full GC,发生STOPPED WORLD,整个Java程序直接暂停,就用标记清理或者标记整理。CMS垃圾收集器(标记清理)。

和GC Root无关的才能被删除

本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论
Read more »