最近對算法突然來了興趣,奈何大學(xué)學(xué)的數(shù)據(jù)結(jié)構(gòu)算法已經(jīng)丟完了,只有自己一點點的撿回來啰。
言歸正傳,來看看LeetCode一道經(jīng)典題:島嶼的個數(shù)
此題可以使用BFS,DFS來解就可以了,我這里分別用了棧,隊列,遞歸三種方法來解,上代碼。
class Solution {
var rows : Int!
var cols : Int!
var visited : [[Bool]]!
var stack : [CGPoint] = []
func numIslands(_ grid : [[Character]]) -> Int {
if (grid.count == 0){
return 0
}
var ans = 0
rows = grid.count
cols = grid[0].count
visited = Array(repeating: Array(repeating: false, count: cols), count: rows)
for i in 0..<rows {
for j in 0..<cols{
if (grid[i][j] == "1" && visited[i][j] == false ){
ans += 1
//BFS(getBFS: grid, i: i, j: j) //遞歸
//BFSWithQueue(grid, i: i, j: j) //隊列
//stack = []
//DFSWithStack(grid, i: i, j: j) //棧
}
}
}
return ans
}
func BFS(getBFS grid : [[Character]], i : Int, j : Int){
if(i>=0 && i<rows && j>=0 && j<cols){
if(grid[i][j] == "1" && visited[i][j] == false){
visited[i][j] = true
BFS(getBFS: grid, i: i+1, j: j)
BFS(getBFS: grid, i: i-1, j: j)
BFS(getBFS: grid, i: i, j: j-1)
BFS(getBFS: grid, i: i, j: j+1)
}
}
}
func BFSWithQueue(_ grid : [[Character]], i : Int, j : Int) {
var queue : [CGPoint] = []
queue.append(CGPoint.init(x: i, y: j))
while !queue.isEmpty {
let x = Int(queue.first!.x)
let y = Int(queue.first!.y)
if(x>=0 && x<rows && y>=0 && y<cols){
if(grid[x][y] == "1" && visited[x][y] == false){
queue.append(CGPoint.init(x: x+1, y: y))
queue.append(CGPoint.init(x: x-1, y: y))
queue.append(CGPoint.init(x: x, y: y+1))
queue.append(CGPoint.init(x: x, y: y-1))
visited[x][y] = true;
}
}
queue.removeFirst()
}
}
func DFSWithStack(_ grid : [[Character]], i : Int, j : Int) {
if(i>=0 && i<rows && j>=0 && j<cols ){
stack.append(CGPoint.init(x: i, y: j))
let x = Int(stack.last!.x)
let y = Int(stack.last!.y)
if(grid[x][y] == "0" || visited[x][y] == true ){
stack.removeLast()
return;
}
visited[x][y] = true;
DFSWithStack(grid, i: x+1, j: y)
DFSWithStack(grid, i: x-1, j: y)
DFSWithStack(grid, i: x, j: y+1)
DFSWithStack(grid, i: x, j: y-1)
}
}
}
swift不熟,不夠優(yōu)雅代碼有冗余,輕噴!