题目
抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 0 表示未被选座,1 表示已被选座或者为障碍物,请实现一个方法求出给定影院中最大可推荐的相邻座位个数。
示例
输入:
[1,0,0,1,0,0,0]
[1,0,0,0,0,1,1]
[0,0,0,1,0,0,0]
[1,1,0,1,1,0,0]
输出:18
思路
深度优先遍历或广度优先遍历。
注:为了节约空间不创建访问数组,当访问到时,直接将该座位变为1即可。
代码
func cinemaSeat(arr [][]int) int {
if len(arr) == 0 {
return 0
}
// 深度优先遍历
// 注:为了节约空间不创建访问数组,当访问到时,直接将该座位变为1即可。
n, m := len(arr), len(arr[0])
// 移动数组,向上下左右移动
move := [][]int {
{-1, 0},
{1, 0},
{0, -1},
{0, 1},
}
count := 0
var dfs func(curr_i, curr_j int)
dfs = func(curr_i, curr_j int) {
// 判断坐标是否偏移
if curr_i >= n || curr_i < 0 || curr_j >= m || curr_j < 0 {
return
}
// 判断当前位置是否已经被购买
if arr[curr_i][curr_j] != 0 {
return
}
// 买票,即将当前位置置为1,同时向上下左右移动
arr[curr_i][curr_j] = 1
count++
// 移动
for i := 0; i < 4; i++ {
dfs((curr_i+move[i][0]), (curr_j+move[i][1]))
}
}
// 循环,列举可能,找到最大值
res := 0
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if arr[i][j] != 1 {
count = 0
dfs(i, j)
res = max(res, count)
}
}
}
return res
}
// 判断最大值
func max(x, y int) int {
if x > y {
return x
}
return y
}
复杂度分析
时间复杂度:O(MN)。遍历一遍数组。
空间复杂度:O(MN)。递归层数。