📣 独立日限时特惠: VIP通行证立减$68
查看: 1679| 回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 求教一道题目

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Given an m*n matrix of 1s and 0s, the value in it is either 1 or 0. 1 means there is a person; 0 means there is no person; If there are 2 or more people on the same row or the same column, then they can see each other. Return the number of people who can see others.
Example:
Inputs:
[
[1, 0, 0, 0],
[0, 0, 1, 1],
[0, 1, 0, 0],
[0, 1, 0, 0]
]
outputs:
4

我只想到了brute force的方法,请教一下有没有好的方法,谢谢🙏

能不能往dp方向想?

上一篇:str_cli函数主要目的是什么
下一篇:Mock Interview(Pramp或任何视讯会议)找愿意一起做模拟面试的小伙伴
推荐
wowmomsos 2020-12-7 15:38:19 | 只看该作者
全局:
  1. def solve(mat):
  2.     """
  3.     mat: 2D array, where the element is either 0 or 1.

  4.     """
  5.     n_row = len(mat)
  6.     n_col = len(mat)
  7.     row_counter = [0 for i in range(n_row)]
  8.     col_counter = [0 for i in range(n_col)]
  9.     for r in range(n_row):
  10.         for c in range(n_col):
  11.             if mat[r][c] == 1:
  12.                 row_counter[r] += 1
  13.                 col_counter[c] += 1
  14.     num = sum(i if i>1 else 0 for i in row_counter) + sum(k if k > 1 else 0 for k in col_counter)
  15.     for r in range(n_row):
  16.         for c in range(n_col):
  17.             if mat[r][c] == 1 and row_counter[r] > 1 and col_counter[c] > 1:
  18.                 num -= 1
  19.     return num
复制代码


O(MN) 的
回复

使用道具 举报

推荐
 楼主| 我是一条大咸鱼 2020-12-7 12:15:13 | 只看该作者
全局:
夏虫何以语冰X 发表于 2020-12-6 21:56
我能想到的两种方法
1. 遍历每一个点,if(grid[j]==1 && valid(grid, i, j)) count++ 其中valid的方法就是 ...

还有一种方法是用set, 只记是1的点的坐标
当时被问到这道题,说了这两种方法之后,要求是利用每行每列person的个数,两个for循环,还有考虑一个人能否看到别人是由什么决定的(抱歉有点语焉不详, 这是我能记起的三个关键词)再做进一步优化
回复

使用道具 举报

🔗
flyman3046 2020-12-7 10:53:51 | 只看该作者
全局:
一个办法是按每行每列处理,如果遇到一行或者列里面1的个数大于1的话,就说明他们都能看到其他的人。用一个boolean[][]来代表每个人会不会看到其他人,这样可以去除重复计算。时间复杂度应该是O(n*m)。不知道你的brute force是不是类似的想法。
回复

使用道具 举报

全局:
我能想到的两种方法
1. 遍历每一个点,if(grid[i][j]==1 && valid(grid, i, j)) count++ 其中valid的方法就是查看同一行和同一列中有没有1出现。当一个点能看到另外一个点,把这些点可以都加入visited中,这样可以减少一些重复visit
2. 或者直接按row扫一遍,按col扫一遍,符合要求的点加入visited来保证不重复记数。
回复

使用道具 举报

🔗
yiliaobailiao 2020-12-7 11:34:45 | 只看该作者
全局:
感觉可以用union find?
回复

使用道具 举报

🔗
 楼主| 我是一条大咸鱼 2020-12-7 11:38:53 | 只看该作者
全局:
flyman3046 发表于 2020-12-6 21:53
一个办法是按每行每列处理,如果遇到一行或者列里面1的个数大于1的话,就说明他们都能看到其他的人。用一个 ...

我的两个brute force的方法和三楼的一样,第一个就是对每个点,去遍历这个点所在的行和列;第二个就是遍历每行每列,用visited来减少重复。
回复

使用道具 举报

全局:
不visit每一个点不可能知道这个点是否有人,所以不可能快于O(mn)。


2 pass:
Pass 1 row major: set记录1的i,j。如果一个row过完set内容大大于1,数上,mark visited。最多一个row全是1,所以速度最低2n每行。所有下来速度是2mn最多

Pass 2 col major: 一样的方法一列大于一个人开始数,但是逐一check是不是visit过,只加没visit过的。同样最多2mn

总体最多4mn,即O(mn)。无需继续优化因为离最快可能只最多只能提高4倍。
回复

使用道具 举报

🔗
sfmnrmnv 2020-12-7 11:41:34 | 只看该作者
全局:
easy难度的题吧,预处理一下, O(mn)
回复

使用道具 举报

🔗
cbtou1 2020-12-7 19:30:16 | 只看该作者
全局:
本帖最后由 cbtou1 于 2020-12-7 19:39 编辑

上面说的都是需要记录visited,这样extra space就超过O(1)了(当然你也可以in place记录..)。实际上不需要特别记录visited,也可以做到时间O(mn), extra space O(1)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表