电影院选座问题----go

电影院选座问题----go

题目

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值