★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9903939.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

In a given 2D binary array A, there are two islands.  (An island is a 4-directionally connected group of 1s not connected to any other 1s.)

Now, we may change 0s to 1s so as to connect the two islands together to form 1 island.

Return the smallest number of 0s that must be flipped.  (It is guaranteed that the answer is at least 1.)

Example 1:

Input: [[0,1],[1,0]]
Output: 1

Example 2:

Input: [[0,1,0],[0,0,0],[0,0,1]]
Output: 2

Example 3:

Input: [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
Output: 1

Note:

  1. 1 <= A.length = A[0].length <= 100
  2. A[i][j] == 0 or A[i][j] == 1

在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)

现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。

返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)

示例 1:

输入:[[0,1],[1,0]]
输出:1

示例 2:

输入:[[0,1,0],[0,0,0],[0,0,1]]
输出:2

示例 3:

输入:[[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1

提示:

  1. 1 <= A.length = A[0].length <= 100
  2. A[i][j] == 0 或 A[i][j] == 1

404ms

  1 class Solution {
  2   func shortestBridge(_ A: [[Int]]) -> Int {
  3     let rowCount = A.count
  4     if rowCount == 0 {
  5       return 0
  6     }
  7
  8     let colCount = A[0].count
  9
 10     var A = A
 11
 12     let coordinates = findFirstIsland(A: A)
 13     let r1 = coordinates[0]
 14     let c1 = coordinates[1]
 15
 16     var nextRiver = [Int]()
 17     removeFirstIsland(A: &A, r: r1, c: c1, river: &nextRiver)
 18
 19     var distance = 0
 20     while nextRiver.count > 0 {
 21       let river = nextRiver
 22       nextRiver = [Int]()
 23
 24       for coordinates in river {
 25         let r = coordinates / rowCount
 26         let c = coordinates % rowCount
 27
 28         let cell = A[r][c]
 29         if cell == 0 {
 30           A[r][c] = -1
 31
 32           if r > 0 {
 33             // top
 34             nextRiver.append((r - 1) * rowCount + c)
 35           }
 36           if (r + 1) < rowCount {
 37             // bottom
 38             nextRiver.append((r + 1) * rowCount + c)
 39           }
 40           if c > 0 {
 41             nextRiver.append(r * rowCount + c - 1)
 42           }
 43           if (c + 1) < colCount {
 44             nextRiver.append(r * rowCount + c + 1)
 45           }
 46         } else if cell == 1 {
 47           return distance
 48         }
 49       }
 50       distance += 1
 51     }
 52     return distance
 53   }
 54
 55   func removeFirstIsland(A: inout [[Int]], r: Int, c: Int, river: inout [Int]) {
 56     let rowCount = A.count
 57     let colCount = A[0].count
 58
 59     let cell = A[r][c]
 60     if cell == 0 {
 61       // A[r][c] = 2
 62       river.append(r * rowCount + c)
 63       return
 64     } else if cell == -1 {
 65       return
 66     }
 67     A[r][c] = -1
 68
 69     if r > 0 {
 70       // top
 71       removeFirstIsland(A: &A, r: r - 1, c: c, river: &river)
 72     }
 73     if (r + 1) < rowCount {
 74       // bottom
 75       removeFirstIsland(A: &A, r: r + 1, c: c, river: &river)
 76     }
 77     if c > 0 {
 78       removeFirstIsland(A: &A, r: r, c: c - 1, river: &river)
 79     }
 80     if (c + 1) < colCount {
 81       removeFirstIsland(A: &A, r: r, c: c + 1, river: &river)
 82     }
 83   }
 84
 85   func findFirstIsland(A: [[Int]]) -> [Int] {
 86     let rowCount = A.count
 87     let colCount = A[0].count
 88     var coordinates = Array(repeating: 0, count: 2)
 89     var r = 0
 90     var c = 0
 91     while r < rowCount {
 92       c = 0
 93       while c < colCount {
 94         if A[r][c] == 1 {
 95           coordinates[0] = r
 96           coordinates[1] = c
 97           return coordinates
 98         }
 99         c += 1
100       }
101       r += 1
102     }
103     return coordinates
104   }
105 }


428ms

 1 class Solution {
 2     func shortestBridge(_ A: [[Int]]) -> Int {
 3         var a = A
 4         var q = [(Int, Int)]()
 5
 6         loop: for i in 0 ..< A.count {
 7             for j in 0 ..< A[i].count {
 8                 if A[i][j] == 1 {
 9                     dfs(&a, i, j, &q)
10                     break loop
11                 }
12             }
13         }
14
15         let dir = [0 , 1 , 0 , -1 , 0]
16         var step = 0
17         while !q.isEmpty {
18
19             var size = q.count
20             while size > 0 {
21                 let (i, j) = q.removeFirst()
22                 for index in 0 ..< 4 {
23                     let ti = i + dir[index]
24                     let tj = j + dir[index + 1]
25                     if ti < 0 || ti >= a.count || tj < 0 || tj >= a[i].count || a[ti][tj] == 2 {
26                         continue
27                     }
28                     if a[ti][tj] == 1 {
29                         return step
30                     } else {
31                         a[ti][tj] = 2
32                         q.append((ti,tj))
33
34                     }
35                 }
36                 size -= 1
37             }
38             step += 1
39         }
40
41         return -1
42     }
43
44     func dfs(_ A: inout [[Int]], _ i: Int, _ j: Int, _ q: inout [(Int, Int)]) {
45         if i < 0 || i >= A.count || j < 0 || j >= A[i].count || A[i][j] != 1 {
46             return
47         } else {
48             A[i][j] = 2
49             q.append((i, j))
50             dfs(&A, i - 1, j, &q)
51             dfs(&A, i + 1, j, &q)
52             dfs(&A, i, j - 1, &q)
53             dfs(&A, i, j + 1, &q)
54         }
55     }
56 }


476ms

 1 class Solution {
 2     func shortestBridge(_ A: [[Int]]) -> Int {
 3         let R = A.count
 4         let C = A[0].count
 5         var qs = [(Int, Int)]()
 6         var color = 1
 7         var v = [[Int]](repeating: [Int](repeating: 0, count: C), count: R)
 8         var ans = 0
 9         func next(_ r: Int, _ c: Int, _ d: inout [String: (Int, Int)]) -> Bool {
10             var ns = [(r+1, c), (r-1, c), (r, c+1), (r, c-1)]
11             for n in ns {
12                 guard 0 ..< R ~= n.0, 0 ..< C ~= n.1 else {
13                     continue
14                 }
15                 guard v[n.0][n.1] == 0 else {
16                     if v[n.0][n.1] != v[r][c] {
17                         //print(n, r, c)
18                         return true
19                     }
20                     continue
21                 }
22                 v[n.0][n.1] = v[r][c]
23                 d["\(n.0), \(n.1)"] = (n.0, n.1)
24             }
25             return false
26         }
27         func paint(_ r: Int, _ c: Int) {
28             guard v[r][c] == 0 else {
29                 return
30             }
31             v[r][c] = color
32             var qs = [(r, c)]
33             while !qs.isEmpty {
34                 for i in 0 ..< qs.count {
35                     let (r, c) = qs.remove(at: 0)
36                     let ns = [(r+1, c), (r-1, c), (r, c+1), (r, c-1)]
37                     for n in ns {
38                         guard 0 ..< R ~= n.0, 0 ..< C ~= n.1 else {
39                             continue
40                         }
41                         guard v[n.0][n.1] == 0, A[n.0][n.1] == 1 else {
42                             continue
43                         }
44                         v[n.0][n.1] = color
45                         qs.append(n)
46                     }
47                 }
48             }
49             color += 1
50         }
51         for r in 0 ..< R {
52             for c in 0 ..< C {
53                 if A[r][c] == 1 {
54                     paint(r, c)
55                     if v[r][c] == 1 {
56                         qs.append((r, c))
57                     }
58                 }
59             }
60         }
61         //print(v)
62         while !qs.isEmpty {
63             //print(qs)
64             var d = [String: (Int, Int)]()
65             for i in 0 ..< qs.count {
66                 let (r, c) = qs.remove(at: 0)
67                 guard next(r, c, &d) == false else {
68                     //print(v)
69                     return ans
70                 }
71             }
72             ans += 1
73             qs = Array(d.values)
74         }
75
76         return ans
77     }
78 }


484ms

 1 class Solution {
 2         struct Coor {
 3             var x:Int;
 4             var y:Int;
 5         }
 6         var visited:[[Bool]] = [[Bool]]();
 7         var grids:[[Int]]!;
 8         func shortestBridge(_ A: [[Int]]) -> Int {
 9             var step:Int = -1;
10             grids = A;
11             for i in 0 ..< A.count{
12                 let oneRow = Array<Bool>(repeating: false, count: A[i].count);
13                 visited.append(oneRow);
14             }
15             var i = 0;
16             var j = 0;
17             for ii in 0 ..< A.count{
18                 for jj in 0 ..< A[ii].count{
19                     if (A[ii][jj] == 1){
20                         i = ii;
21                         j = jj;
22                         break;
23                     }
24                 }
25             }
26             let island_A = completeThisIsland(x: i, y: j);
27 //            resetVisited()
28             var queue = Array<Coor>();
29             var steps = Array<Int>(repeating: 0, count: island_A.count);
30             queue.append(contentsOf: island_A);
31             var found = false;
32             while (!found){
33                 let co = queue.removeFirst();
34                 let thisStep = steps.removeFirst();
35                 let neighbors = [Coor(x: co.x-1, y: co.y),Coor(x: co.x+1, y: co.y),Coor(x: co.x, y: co.y+1),Coor(x:co.x,y:co.y-1)];
36                 for neighbor in neighbors{
37                     if valid(coor: neighbor) && !visited[neighbor.x][neighbor.y]{
38                         if grids[neighbor.x][neighbor.y] == 1{
39                             step = thisStep;
40                             found = true;
41                             break;
42                         }else{
43                             queue.append(neighbor)
44                             steps.append(thisStep+1)
45                             visited[neighbor.x][neighbor.y] = true;
46                         }
47 //                        queue.append(neighbor);
48 //                        visited[neighbor.x][neighbor.y] = true;
49                     }
50                 }
51             }
52
53             return step;
54         }
55         func resetVisited() -> Void {
56             for var i in visited{
57                 for j in 0 ..< i.count{
58                     i[j] = false;
59                 }
60             }
61         }
62         func valid(coor:Coor) -> Bool {
63             return coor.x > -1 && coor.x < grids.count && coor.y > -1 && coor.y < grids[coor.x].count;
64         }
65         func completeThisIsland(x:Int,y:Int) -> [Coor] {
66             var result = [Coor]();
67             var queue = [Coor]();
68             queue.append(Coor(x: x, y: y))
69             visited[x][y] = true;
70             while(!queue.isEmpty){
71                 let co = queue.removeFirst();
72 //                visited[co.x][co.y] = true;
73                 result.append(co);
74                 let neighbors = [Coor(x: co.x-1, y: co.y),Coor(x: co.x+1, y: co.y),Coor(x: co.x, y: co.y+1),Coor(x:co.x,y:co.y-1)];
75                 for neighbor in neighbors{
76                     if valid(coor: neighbor) && grids[neighbor.x][neighbor.y] == 1 && !visited[neighbor.x][neighbor.y]{
77                         queue.append(neighbor);
78                         visited[neighbor.x][neighbor.y] = true;
79                     }
80                 }
81             }
82             return result;
83         }
84     }


624ms

  1 class Solution {
  2     func shortestBridge(_ A: [[Int]]) -> Int {
  3         var a = A
  4         //print(A)
  5         var edI = -1
  6         var edJ = -1
  7         for i in (0..<A.count) {
  8             for j in (0..<A[i].count) {
  9                 if A[i][j] == 1 {
 10                     edI = i
 11                     edJ = j
 12                     break
 13                 }
 14             }
 15             if edI != -1 { break }
 16         }
 17
 18         //print(edI, edJ)
 19         bfs(&a, edI, edJ)
 20
 21         for i in (0..<a.count) {
 22             for j in (0..<a[i].count) {
 23                 if a[i][j] == 1 {
 24                     a[i][j] = -2
 25                 }
 26             }
 27         }
 28         //print(a)
 29
 30         return dfs(&a, edI, edJ) - 1
 31     }
 32
 33     func bfs(_ A: inout [[Int]], _ i: Int, _ j: Int) {
 34         A[i][j] = -1
 35         if i+1 < A.count && A[i+1][j] == 1 {
 36             A[i+1][j] = -1
 37             bfs(&A, i+1, j)
 38         }
 39
 40         if j + 1 < A[i].count && A[i][j+1] == 1 {
 41             A[i][j+1] = -1
 42             bfs(&A, i, j+1)
 43         }
 44
 45         if i > 0 && A[i-1][j] == 1 {
 46             A[i-1][j] = -1
 47             bfs(&A, i-1, j)
 48         }
 49
 50         if j > 0 && A[i][j-1] == 1 {
 51             A[i][j-1] = -1
 52             bfs(&A, i, j-1)
 53         }
 54     }
 55
 56     func dfs(_ A: inout [[Int]], _ i: Int, _ j: Int) -> Int {
 57         var queue: [Int] = []
 58         queue.append(i * 200 + j)
 59         while queue.count > 0 {
 60             //print(queue)
 61             //print(A)
 62             let curI = queue[0] / 200
 63             let curJ = queue[0] % 200
 64             if A[curI][curJ] == -1 { A[curI][curJ] = -3 }
 65             queue.remove(at: 0)
 66             if curI+1 < A.count {
 67                 if A[curI+1][curJ] == -2 {
 68                     return A[curI][curJ] + 1
 69                 } else if A[curI+1][curJ] == -1 {
 70                     queue.insert((curI+1)*200+curJ, at: 0)
 71                 } else if A[curI+1][curJ] == 0 {
 72                     if A[curI][curJ] < 0 {
 73                         A[curI+1][curJ] = 1
 74                     } else {
 75                         A[curI+1][curJ] = A[curI][curJ] + 1
 76                     }
 77                     queue.append((curI+1)*200+curJ)
 78                 }
 79             }
 80
 81             if curJ+1 < A[curI].count {
 82                 if A[curI][curJ+1] == -2 {
 83                     return A[curI][curJ] + 1
 84                 } else if A[curI][curJ+1] == -1 {
 85                     queue.insert((curI)*200+curJ+1, at: 0)
 86                 } else if A[curI][curJ+1] == 0 {
 87                     if A[curI][curJ] < 0 {
 88                         A[curI][curJ+1] = 1
 89                     } else {
 90                         A[curI][curJ+1] = A[curI][curJ] + 1
 91                     }
 92                     queue.append((curI)*200+curJ+1)
 93                 }
 94             }
 95
 96             if curI > 0 {
 97                 if A[curI-1][curJ] == -2 {
 98                     return A[curI][curJ] + 1
 99                 } else if A[curI-1][curJ] == -1 {
100                     queue.insert((curI-1)*200+curJ, at: 0)
101                 } else if A[curI-1][curJ] == 0 {
102                     if A[curI][curJ] < 0 {
103                         A[curI-1][curJ] = 1
104                     } else {
105                         A[curI-1][curJ] = A[curI][curJ] + 1
106                     }
107                     queue.append((curI-1)*200+curJ)
108                 }
109             }
110
111             if curJ > 0 {
112                 if A[curI][curJ-1] == -2 {
113                     return A[curI][curJ] + 1
114                 } else if A[curI][curJ-1] == -1 {
115                     queue.insert((curI)*200+curJ-1, at: 0)
116                 } else if A[curI][curJ-1] == 0 {
117                     if A[curI][curJ] < 0 {
118                         A[curI][curJ-1] = 1
119                     } else {
120                         A[curI][curJ-1] = A[curI][curJ] + 1
121                     }
122                     queue.append((curI)*200+curJ-1)
123                 }
124             }
125
126         }
127         return 0
128      }
129 }


648ms

  1 class Solution {
  2     func shortestBridge(_ A: [[Int]]) -> Int {
  3         var n:Int = A.count, m = A[0].count
  4         var can:[[Bool]] = [[Bool]](repeating: [Bool](repeating: false, count: m), count: n)
  5         var dr:[Int] = [1, 0, -1, 0 ]
  6         var dc:[Int] = [0, 1, 0, -1 ]
  7         var d:[[Int]] = [[Int]](repeating: [Int](repeating: 99999999, count: m), count: n)
  8
  9         var gq:Queue<[Int]> = Queue<[Int]>()
 10         inner:
 11         for i in 0..<n
 12         {
 13             for j in 0..<m
 14             {
 15                 if A[i][j] == 1
 16                 {
 17                     var q:Queue<[Int]> = Queue<[Int]>()
 18                     q.enQueue([i,j])
 19                     can[i][j] = true
 20                     while(!q.isEmpty())
 21                     {
 22                         var cur:[Int] = q.deQueue()!
 23                         gq.enQueue(cur)
 24                         var r:Int = cur[0], c:Int = cur[1]
 25                         d[r][c] = 0
 26                         for k in 0..<4
 27                         {
 28                             var nr:Int = r + dr[k], nc:Int = c + dc[k]
 29                             if nr >= 0 && nr < n && nc >= 0 && nc < m && A[nr][nc] == 1 && !can[nr][nc]
 30                             {
 31                                 can[nr][nc] = true
 32                                  q.enQueue([nr, nc])
 33                             }
 34                         }
 35                     }
 36                     break inner
 37                 }
 38             }
 39         }
 40
 41         while(!gq.isEmpty())
 42         {
 43             var cur:[Int] = gq.deQueue()!
 44             var r:Int = cur[0], c:Int = cur[1]
 45             for k in 0..<4
 46             {
 47                 var nr:Int = r + dr[k], nc:Int = c + dc[k]
 48                 if nr >= 0 && nr < n && nc >= 0 && nc < m && d[nr][nc] > d[r][c] + 1
 49                 {
 50                     d[nr][nc] = d[r][c] + 1
 51                     gq.enQueue([nr, nc])
 52                 }
 53             }
 54         }
 55         var ret:Int = 9999999
 56         for i in 0..<n
 57         {
 58             for j in 0..<m
 59             {
 60                 if !can[i][j] && A[i][j] == 1
 61                 {
 62                     ret = min(ret, d[i][j])
 63                 }
 64             }
 65         }
 66         return ret-1
 67     }
 68 }
 69
 70 public struct Queue<T> {
 71
 72     // 泛型数组:用于存储数据元素
 73     fileprivate var queue: [T]
 74
 75     // 返回队列中元素的个数
 76     public var count: Int {
 77         return queue.count
 78     }
 79
 80     // 构造函数:创建一个空的队列
 81     public init() {
 82         queue = [T]()
 83     }
 84
 85     //通过既定数组构造队列
 86     init(_ arr:[T]){
 87         queue = arr
 88     }
 89
 90     // 如果定义了默认值,则可以在调用函数时省略该参数
 91     init(_ elements: T...) {
 92         queue = elements
 93     }
 94
 95     // 检查队列是否为空
 96     // - returns: 如果队列为空,则返回true,否则返回false
 97     public func isEmpty() -> Bool {
 98         return queue.isEmpty
 99     }
100
101     // 入队列操作:将元素添加到队列的末尾
102     public mutating func enQueue(_ element: T) {
103         queue.append(element)
104     }
105
106     // 出队列操作:删除并返回队列中的第一个元素
107     public mutating func deQueue() -> T? {
108         return queue.removeFirst()
109     }
110 }

转载于:https://www.cnblogs.com/strengthen/p/9903939.html

[Swift]LeetCode934. 最短的桥 | Shortest Bridge相关推荐

  1. leetcode934. 最短的桥(dfs+bfs)

    在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大组.) 现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛. 返回必须翻转的 0 的最小数目.(可以保证答 ...

  2. 【LeetCode】934. 最短的桥

    题目 934. 最短的桥 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域. 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连.grid ...

  3. Leetcode最短的桥

    934. 最短的桥 思路:先通过任意搜索方法找到其中一个岛屿 然后利用广度优先搜索,查找其与另一个岛屿的最短距离. class Solution {public:vector<int> d ...

  4. Java泛型中的桥方法(Bridge Method)

    前几天在看 Java 泛型的时候,发现了一个有趣的现象.就是在某些情况下,编译器在编译我们的类文件的时候会帮我们自动生成某些方法,称作桥方法. 我们知道 Java 中的泛型在编译为 class 的时候 ...

  5. 设计模式的理解:桥模式 Bridge

    当一种抽象有多种实现时通常用继承来实现他们.桥模式的设计和装饰模式 有一定的相似之处,都是通过组合来解决继承的滥用问题.现有一个需求,将一个项目分成普通用户版和VIP版,该项目要同时支持WINDOW1 ...

  6. 结构型 桥模式 -Bridge

    早上碰到MM,要说早上好,晚上碰到MM,要说晚上好:碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦.不要问我"早上碰到MM新做了个发型怎么说" ...

  7. 【Breadth-first Search 】934. Shortest Bridge

    输入:一个二维数组,每个元素的值为0/1. 规则:所有连在一起的1是一个岛屿,数组中包含2个岛屿.连在一起是指上下左右4个方向.可以将0变为1,将2个岛屿链接在一起. 输出:最小改变多少个0就可以将2 ...

  8. LeetCode 934. 最短的桥(2次BFS)

    1. 题目 在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大组.) 现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛. 返回必须翻转的 0 的最小数目. ...

  9. LeetCode 934 最短的桥

    题目描述 在给定的二维二进制数组 A 中,存在两座岛.(岛是由四面相连的 1 形成的一个最大 组.)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛.返回必须翻转的 0 的最小数目.(可 ...

最新文章

  1. LIC-Fusion 2.0:基于滑动窗口法平面特征跟踪的激光雷达惯性相机里程计
  2. 技术硬核还不够?互联网企业出海指南来了!
  3. k-substrings(CF961F)
  4. 简直要吐槽!!enable-migrations fails on x64 Projects
  5. iOS中将后台JSON数据转化为模型的总结
  6. JAVA——JVM参数设置规则以及参数含义
  7. android单例模式代码,在Android studio 中使用单例模式(示例代码)
  8. Rust : AES算法加密、解密
  9. 华为路由器配置Telnet登录
  10. svn -- 客户端+服务端的下载安装及配置
  11. 儒略日小工具-输入年月日时分秒转换儒略日
  12. Word2010专项试题(1)
  13. 网站开发进阶(二十四)HTML颜色代码表
  14. 分享几个免费的人工智能类API接口
  15. 读书记之《UnixLinux大学教程》
  16. hexo添加文章更新时间
  17. Win11机械硬盘磁盘碎片整理方法
  18. jQuery中的end()方法
  19. 【知识碎片】python 字符串格式化输出:%d,%s,%f
  20. springboot集成通用mapper与分页助手时报错,java.lang.NoSuchMethodException: com.github.abel533.provider.....

热门文章

  1. 修改Eclipse中项目在Apache Tomcat中的部署路径
  2. java日期时间的转化
  3. java中jsp页面foreach遍历输出的使用
  4. 9-分析事物问题并编写 Utils 文件
  5. SDUTOJ2779_找朋友(BFS | | DFS双解法)
  6. Redis学习笔记(八)——持久化
  7. 一个好玩的 屏蔽别人审查元素F12 右键及其他复制粘贴等
  8. (转)编写可重入和线程安全的代码(Writing Reentrant and Thread-Safe Code)
  9. 不要成为自己讨厌的那种程序员
  10. Docker之 默认桥接网络与自定义桥接网卡