电影院座位推荐--字节青训营

472 阅读1分钟

题目

抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 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}}));
}

运行结果

image.png