2021-09-03 22:24:58 +02:00
# Given an m x n 2D binary grid grid which represents a map of '1's (land) and '0's (water), return the number of islands.
# An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
2021-08-23 00:58:47 +02:00
2021-09-03 22:24:58 +02:00
# Example 1:
# Input: grid = [
2021-08-23 00:58:47 +02:00
# ["1","1","1","1","0"],
# ["1","1","0","1","0"],
# ["1","1","0","0","0"],
# ["0","0","0","0","0"]
2021-09-03 22:24:58 +02:00
# ]
# Output: 1
2021-08-23 00:58:47 +02:00
2021-09-03 22:24:58 +02:00
# Example 2:
# Input: grid = [
2021-08-23 00:58:47 +02:00
# ["1","1","0","0","0"],
# ["1","1","0","0","0"],
# ["0","0","1","0","0"],
# ["0","0","0","1","1"]
2021-09-03 22:24:58 +02:00
# ]
# Output: 3
2021-08-23 00:58:47 +02:00
2021-09-03 22:24:58 +02:00
# Constraints:
# m == grid.length
# n == grid[i].length
# 1 <= m, n <= 300
# grid[i][j] is '0' or '1'.
2021-08-23 00:58:47 +02:00
2021-09-03 22:24:58 +02:00
# DFS, Recursive Bottom Up Approach - O(n*m) Time / O(1) Space
# Init num_of_islands = 0, return if the grid is empty
# Start a double loop with index to iterate through each plot (each value is a plot of either water or land in this case)
# if the plot is land, dfs(grid, x, y)
# num_of_islands += 1
# Return num_of_islands
2021-08-23 00:58:47 +02:00
2021-09-03 22:24:58 +02:00
# dfs(grid, x, y)
# Return if x or y are out of bounds, or if the plot is water
# Make the current plot water
# Call dfs again for up, down, left, and right
2021-08-23 00:58:47 +02:00
# @param {Character[][]} grid
# @return {Integer}
def num_islands ( grid )
2021-09-03 22:24:58 +02:00
return 0 if grid . empty?
# init num of islands
islands = 0
# loop through each element (plot) in the 2d array
grid . each_with_index do | row , x |
row . each_with_index do | plot , y |
# if the plot is water, start a dfs
next unless plot == '1'
dfs ( grid , x , y )
# add 1 to islands once all connected land plots are searched
islands += 1
2021-08-23 00:58:47 +02:00
end
2021-09-03 22:24:58 +02:00
end
# return ans
islands
2021-08-23 00:58:47 +02:00
end
def dfs ( grid , x , y )
2021-09-03 22:24:58 +02:00
# don't search if out of bounds, or if it's already water
return if x < 0 || x > = grid . length || y < 0 || y > = grid [ 0 ] . length || grid [ x ] [ y ] == '0'
# set the plot to water
grid [ x ] [ y ] = '0'
# search each adjacent plot
dfs ( grid , x - 1 , y ) # up
dfs ( grid , x + 1 , y ) # down
dfs ( grid , x , y - 1 ) # left
dfs ( grid , x , y + 1 ) # right
2021-08-23 00:58:47 +02:00
end