Redian新闻
>
给一堆points, 找到所有给定长度的正方形
avatar
给一堆points, 找到所有给定长度的正方形# JobHunting - 待字闺中
K*n
1
输入是一组二维空间里面的点,由x,y值表示。
给定一个长度L,
要求返回所有由这些点形成的边长为L的正方形。
刚才电面一个小公司,没做出来,只想到了hash table。必挂了。
avatar
C*U
2
我的想法 先把所有点 按照行分成group
然后每个group 取出两个点的列坐标hash
然后行和行之间check

【在 K*********n 的大作中提到】
: 输入是一组二维空间里面的点,由x,y值表示。
: 给定一个长度L,
: 要求返回所有由这些点形成的边长为L的正方形。
: 刚才电面一个小公司,没做出来,只想到了hash table。必挂了。

avatar
K*n
3
没说square的边是和坐标轴平行的,可以是斜着的。
说实话这个题我不能说多么难,但是25分钟让我搞定算法和code,我没这个能力,我觉
得电面这个有些过分,对我这个水平来说。

【在 C***U 的大作中提到】
: 我的想法 先把所有点 按照行分成group
: 然后每个group 取出两个点的列坐标hash
: 然后行和行之间check

avatar
C*U
4
好吧 想简单了

【在 K*********n 的大作中提到】
: 没说square的边是和坐标轴平行的,可以是斜着的。
: 说实话这个题我不能说多么难,但是25分钟让我搞定算法和code,我没这个能力,我觉
: 得电面这个有些过分,对我这个水平来说。

avatar
K*n
5
我现在很想骂娘,对这个题。
可能水平高的人会说,还是骂我自己水平差吧。但是确实是在我能力范围之外了。

【在 C***U 的大作中提到】
: 好吧 想简单了
avatar
C*U
6
题目看错了
原来是给定长度的正方形

【在 K*********n 的大作中提到】
: 输入是一组二维空间里面的点,由x,y值表示。
: 给定一个长度L,
: 要求返回所有由这些点形成的边长为L的正方形。
: 刚才电面一个小公司,没做出来,只想到了hash table。必挂了。

avatar
K*n
7
brute force至少O(n^4),我当时也没办法了,我说我就brute force,他说不行,没技
术含量。
前面问题都问得很好,突然上来个这个,擦。

【在 C***U 的大作中提到】
: 题目看错了
: 原来是给定长度的正方形

avatar
K*n
8
你说说怎么做

【在 C***U 的大作中提到】
: 题目看错了
: 原来是给定长度的正方形

avatar
R*y
9
为每一个点创立一个array,里面按顺序存放所有到这个点距离为L的点。
把每个array看成一个set,找出所有交集为2的set。
O(n^2 log n)
avatar
K*n
10
第一步为n^2
第二步如何在log n内完成呢?

【在 R********y 的大作中提到】
: 为每一个点创立一个array,里面按顺序存放所有到这个点距离为L的点。
: 把每个array看成一个set,找出所有交集为2的set。
: O(n^2 log n)

avatar
D*d
11
想到一个 O(n^3) 的解法:
1. sort on x axis -- O(nlg(n)) x1 <= .... <= xn
2. for each pair (n1,n4) check d(n1,n4) == sqrt(2)L,
if yes, check 2sum problem on x: s.t. x2+x3 = x1 + x4
if yes, check d(n2,n3) == sqrt(2)L,
if yes, output (x1,x2,x3,x4)
n^2 pairs * 2sum = O(n^3)
avatar
R*y
12
两步都是O(n^2 log n),加法关系...

【在 K*********n 的大作中提到】
: 第一步为n^2
: 第二步如何在log n内完成呢?

avatar
K*n
13
好像差不多

【在 R********y 的大作中提到】
: 为每一个点创立一个array,里面按顺序存放所有到这个点距离为L的点。
: 把每个array看成一个set,找出所有交集为2的set。
: O(n^2 log n)

avatar
K*n
14
这个2sum用得挺好,貌似这样可以吧……
不过每一个pair可能能形成两个正方形,所以2sum最后一步,找到n2和n3后,不能quit
,可能还有一对儿n2和n3.

【在 D**********d 的大作中提到】
: 想到一个 O(n^3) 的解法:
: 1. sort on x axis -- O(nlg(n)) x1 <= .... <= xn
: 2. for each pair (n1,n4) check d(n1,n4) == sqrt(2)L,
: if yes, check 2sum problem on x: s.t. x2+x3 = x1 + x4
: if yes, check d(n2,n3) == sqrt(2)L,
: if yes, output (x1,x2,x3,x4)
: n^2 pairs * 2sum = O(n^3)
:

avatar
l*i
15
这个凌行就不对把,四条边都是L长度不一定是正方形阿

【在 R********y 的大作中提到】
: 为每一个点创立一个array,里面按顺序存放所有到这个点距离为L的点。
: 把每个array看成一个set,找出所有交集为2的set。
: O(n^2 log n)

avatar
K*n
16
是啊……
所以我现在还在郁闷,不到半小时让写个这个。

【在 l***i 的大作中提到】
: 这个凌行就不对把,四条边都是L长度不一定是正方形阿
avatar
R*y
17
找出四个点之后,随便检查某一个角是不是直角,只要const time啊,又不影响总体复
杂度。
开始写的时候这些部分都用函数好了,框架写完了,再慢慢implement这些函数。

【在 l***i 的大作中提到】
: 这个凌行就不对把,四条边都是L长度不一定是正方形阿
avatar
f*e
18
check斜率乘积=-1。

【在 R********y 的大作中提到】
: 找出四个点之后,随便检查某一个角是不是直角,只要const time啊,又不影响总体复
: 杂度。
: 开始写的时候这些部分都用函数好了,框架写完了,再慢慢implement这些函数。

avatar
K*n
19
那这个不如检查对角线对着的点的距离是不是根号2*L。
检查直角原理没什么难的,写起来又要费一番功夫。

【在 R********y 的大作中提到】
: 找出四个点之后,随便检查某一个角是不是直角,只要const time啊,又不影响总体复
: 杂度。
: 开始写的时候这些部分都用函数好了,框架写完了,再慢慢implement这些函数。

avatar
d*g
20

是蛮恐怖。。。

【在 K*********n 的大作中提到】
: 是啊……
: 所以我现在还在郁闷,不到半小时让写个这个。

avatar
h*n
21
可以O(n^2)

【在 K*********n 的大作中提到】
: 输入是一组二维空间里面的点,由x,y值表示。
: 给定一个长度L,
: 要求返回所有由这些点形成的边长为L的正方形。
: 刚才电面一个小公司,没做出来,只想到了hash table。必挂了。

avatar
p*2
22
新人轻拍,可以这样不
先建立一个hashmap,判断点存在于出入中不,这样是n
for每对A,B如果距离为sqrt(2)L,这样是n^2
算出对应另外构成正方形的2点的坐标(已知对角线可以唯一确定一个正方形?这样
能求出另外2点),然后再丢到hashmap看存在不,都存在就输出
for loop里面是常数,所以是n+n^2
求大牛指教
avatar
A*u
23
变态啊

【在 K*********n 的大作中提到】
: 输入是一组二维空间里面的点,由x,y值表示。
: 给定一个长度L,
: 要求返回所有由这些点形成的边长为L的正方形。
: 刚才电面一个小公司,没做出来,只想到了hash table。必挂了。

avatar
j*y
24
这不就是O(n^2)么,不需要排序啊

【在 R********y 的大作中提到】
: 为每一个点创立一个array,里面按顺序存放所有到这个点距离为L的点。
: 把每个array看成一个set,找出所有交集为2的set。
: O(n^2 log n)

avatar
T*a
25
这是哪家呀?够变态的。

【在 K*********n 的大作中提到】
: 输入是一组二维空间里面的点,由x,y值表示。
: 给定一个长度L,
: 要求返回所有由这些点形成的边长为L的正方形。
: 刚才电面一个小公司,没做出来,只想到了hash table。必挂了。

avatar
K*n
26
求教

【在 h****n 的大作中提到】
: 可以O(n^2)
avatar
K*n
27
问题是,怎么算春另外构成正方形的2点的坐标?你得在所有点里面找对不对?那又暴力
了。

【在 p********2 的大作中提到】
: 新人轻拍,可以这样不
: 先建立一个hashmap,判断点存在于出入中不,这样是n
: for每对A,B如果距离为sqrt(2)L,这样是n^2
: 算出对应另外构成正方形的2点的坐标(已知对角线可以唯一确定一个正方形?这样
: 能求出另外2点),然后再丢到hashmap看存在不,都存在就输出
: for loop里面是常数,所以是n+n^2
: 求大牛指教

avatar
D*d
28
想到一个 O(n^2 lg(n) ) 的解法:
1. sort on x axis, for the same x, sort on y both ascend-- O(nlg(n))
2. for each pair (n1,n4) check d(n1,n4) == sqrt(2) L
if yes, solve a linear equation, get the axis of other two nodes (n2,n3)
of the sqare with (n1,n4) as diagonal nodes
check the existences of (n2,n3) in sorted list

n^2 * lg(n) = O(n^2lg(n))
avatar
K*n
29
其实我发这个题上来就看看大家的评论,这个题作为一个25分钟的电面题是否过分。有
助于我对面试难度和我的水平的评判。看到这里,我等低水平没追求的(有个offer就行
)也就大致心安一些了,看来是挺过分……
就怕这种题算很一般般的面试题,那我真要全聚德了。

【在 A**u 的大作中提到】
: 变态啊
avatar
K*n
30
要排序,否则第二部怎么能在n^2 log n完成

【在 j******y 的大作中提到】
: 这不就是O(n^2)么,不需要排序啊
avatar
K*n
31
OkCupid,不提也罢……他家的主页实在是…………

【在 T******a 的大作中提到】
: 这是哪家呀?够变态的。
avatar
j*y
32
不是n^2就可以了么,不用排序,随便给每个点一个index就够了吧

【在 K*********n 的大作中提到】
: 要排序,否则第二部怎么能在n^2 log n完成
avatar
l*i
33
我直觉这个地方要用到很多的graph theory

【在 K*********n 的大作中提到】
: OkCupid,不提也罢……他家的主页实在是…………
avatar
p*2
34
不需要去点里面找,对每2点,距离是根号2L了,可以唯一确定一个边长L正方
形吧,用数学公式直接算另外的2个点,是常数时间,然后算出的这对应2个点丢到
hashmap里面
去看存在不,都存在就输出
大牛指正

暴力

【在 K*********n 的大作中提到】
: 问题是,怎么算春另外构成正方形的2点的坐标?你得在所有点里面找对不对?那又暴力
: 了。

avatar
K*n
35
nice,this is part of THE solution

【在 p********2 的大作中提到】
: 不需要去点里面找,对每2点,距离是根号2L了,可以唯一确定一个边长L正方
: 形吧,用数学公式直接算另外的2个点,是常数时间,然后算出的这对应2个点丢到
: hashmap里面
: 去看存在不,都存在就输出
: 大牛指正
:
: 暴力

avatar
c*t
36
brute force 可以是N^2吧。
把所有点放入hashtable做key
对每一个点p1,遍历其他点找距离为L的点p2, 这时候p3,p4可以计算出,到hashtable
里找有没有。
面试官是不是a3啊,这么狠?

【在 K*********n 的大作中提到】
: brute force至少O(n^4),我当时也没办法了,我说我就brute force,他说不行,没技
: 术含量。
: 前面问题都问得很好,突然上来个这个,擦。

avatar
c*t
37
嗯,看来前面同学已经给出这样的解法了。说出解法还好,如果还要求写出codes,那真
是变态。还有要是点很多,hashmap用不了就更惨了。

hashtable

【在 c********t 的大作中提到】
: brute force 可以是N^2吧。
: 把所有点放入hashtable做key
: 对每一个点p1,遍历其他点找距离为L的点p2, 这时候p3,p4可以计算出,到hashtable
: 里找有没有。
: 面试官是不是a3啊,这么狠?

avatar
K*n
38
白哥哥。前面的开放性问题一个比一个答得让我觉得舒坦,他feedback也很好,突然说
,还有25分钟,写个代码……

hashtable

【在 c********t 的大作中提到】
: brute force 可以是N^2吧。
: 把所有点放入hashtable做key
: 对每一个点p1,遍历其他点找距离为L的点p2, 这时候p3,p4可以计算出,到hashtable
: 里找有没有。
: 面试官是不是a3啊,这么狠?

avatar
g*e
39
这些点是正方形的角吗?还是边上的点也可以?
avatar
K*n
40
当然是角

【在 g*********e 的大作中提到】
: 这些点是正方形的角吗?还是边上的点也可以?
avatar
l*b
41
啊,想到这个发现已经被写了。。。

【在 p********2 的大作中提到】
: 不需要去点里面找,对每2点,距离是根号2L了,可以唯一确定一个边长L正方
: 形吧,用数学公式直接算另外的2个点,是常数时间,然后算出的这对应2个点丢到
: hashmap里面
: 去看存在不,都存在就输出
: 大牛指正
:
: 暴力

avatar
R*g
42
for( 遍历一堆点中 4点(a, b,c, d )组合 )

计算 ab,ac, ad, bc,bd, cd 6条边的长度,

if ( 4条边 == L )&&( 剩余2条边 相等)
pickup( a, b, c ,d ).

当然在 程序和效率 上还可以优化一下。
重点是 通过边长判断,你要是搞 角度 斜率就 out 了
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。