题目
抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 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
思路
这道题目和我做过的《岛屿数量》的题目非常类似,就是使用DFS来递归得到周围的连续信息,最终达到统计座位的目的!
- step 1:优先判断空矩阵等情况。
- step 2:从上到下从左到右遍历矩阵每一个位置的元素,如果该元素值为0(空位),统计推荐座位数量。
- step 3:接着将该位置的0改为1(表示已经访问过了),然后使用dfs判断四个方向是否为0,分别进入4个分支继续统计。
代码
public int maxRecommend(int[][] cinema) {
int r = cinema.length;
if (r == 0) return 0; //空矩阵的情况
int c = cinema[0].length;
int res = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (cinema[i][j] == 0) {//没有被访问并且有空位
res = Math.max(res, dfs(cinema, i, j, r, c));
}
}
}
return res;
}
//用来统计从i,j开始的连续一片有多少个座位
private int dfs(int[][] cinema, int i, int j, int r, int c) {
if (cinema[i][j] == 1) return 0;//结束条件:访问过或者无空位
cinema[i][j] = 1;//设置为访问过
int count = 1;//初始化推荐座位为1
if (i - 1 >= 0 && cinema[i - 1][j] == 0) {
//左边
count = count + dfs(cinema, i - 1, j, r, c);
}
if (i + 1 < r && cinema[i + 1][j] == 0) {
//右边
count = count + dfs(cinema, i + 1, j, r, c);
}
if (j - 1 >= 0 && cinema[i][j - 1] == 0) {
//左边
count = count + dfs(cinema, i, j - 1, r, c);
}
if (j + 1 < c && cinema[i][j + 1] == 0) {
//左边
count = count + dfs(cinema, i, j + 1, r, c);
}
return count;
}
@Test
void test() {
System.out.println(maxRecommend(new int[][]{{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}}));
}